2016-11-07 5 views
1

숫자가 아닌 수식을 기반으로 새 열을 만드는 방법에 대한 답을 많이 찾을 수있었습니다.이름 목록을 사용하여 수식을 기반으로 새 열 만들기

변수가 속하는 범주를 나타내는 새로운 열을 작성해야하는 녹은 데이터 프레임이 있습니다. 내가 많이 있기 때문에 새 열을 만들려면 다음을 사용하고 싶습니다 -

내가 작업 환경에 저장된 각각의 범주에 오는 변수 이름의 목록이
Year Type  variable  value 
1 2016 T Agrostis.canina   6 
2 2016 R Agrostis.canina   2 
3 2016 Q Agrostis.canina   0 
4 2016 T Carex.nigra    0 
5 2016 R Carex.nigra    9 
6 2016 Q Carex.nigra    3 
7 2015 T Agrostis.canina   0 
8 2015 R Agrostis.canina   2 
9 2015 Q Agrostis.canina   0 
10 2015 T Carex.nigra    6 
11 2015 R Carex.nigra    0 
12 2015 Q Carex.nigra    5 

: 이것은 내 현재 dataframe의 한 부분입니다 변수 이름! 이상적으로 dataframe은 다음과 같이 보일 것이다 :

Year Type  variable  value veg.type 
1 2016 T Agrostis.canina   6 Graminoid 
2 2016 R Agrostis.canina   2 Graminoid 
3 2016 Q Agrostis.canina   0 Graminoid 
4 2016 T Carex.nigra    0 Dwarf.shrub 
5 2016 R Carex.nigra    9 Dwarf.shrub 
6 2016 Q Carex.nigra    3 Dwarf.shrub 
7 2015 T Agrostis.canina   0 Graminoid 
8 2015 R Agrostis.canina   2 Graminoid 
9 2015 Q Agrostis.canina   0 Graminoid 
10 2015 T Carex.nigra    6 Dwarf.shrub 
11 2015 R Carex.nigra    0 Dwarf.shrub 
12 2015 Q Carex.nigra    5 Dwarf.shrub 

나는 내에서 ifelse 사용하여 시도,하지만 난 아직 아무것도 작동하지 않았다 나는 그것의 핵심 부분을 누락 생각합니다.

미리 감사드립니다.

편집 : 각 veg.type은 기본적으로 다양한 변수 즉 하위 집합입니다. 등

Dwarf.shrub <- c("Calluna.vulgaris", "Empetrum.nigrum", "Erica.cinerea"...) Graminoid <- c("Agrostis.canina", "Deschampsia.flexuosa", "Holcus.lanatus"...)

이것은 내가 같은 veg.type에 나올 변수를 많이 할 것을 의미한다. 이것으로 조금 더 명확 해지기를 바랍니다.

+0

데이터를 결합하는 데 사용하는 키가 있습니까? 기본 R 또는을 확인하십시오.dplyr의 left_join은 데이터 조작을 위해 가장 많이 제안합니다 –

+0

어떤 기준으로 값을 veg.type 열에 할당하고 있습니까? –

+0

각 veg.type 목록 아래에 변수가있는 목록 또는 데이터 프레임이 있습니다 (예 : ) Dwarf.shrub <- c ("Calluna.vulgaris", "Empetrum.nigrum", "Erica.cinerea"...) Graminoid <- c ("Agrostis.canina", "Deschampsia.flexuosa", "Holcus.lanatus"...) ' 등 각 veg.type 아래에 여러 개의 변수가 있습니다. 내가 보여 줬어. 'merge'와'left_join'은 내가해야 할 일을 위해 아래와 같이 작동하지 않습니다. – dunnns

답변

0

조회로 사용될 두 번째 데이터 프레임을 만들고 기본 데이터 프레임에 left_join()을 만듭니다. stack()은 목록을 스택 데이터 프레임으로 직접 변환합니다.

df2 <- stack(list(Dwarf.Shrub=c("Carex.nigra", "Empetrum.nigrum"), Graminoid=c("Agrostis.canina", "Deschampsia.flexuosa"))) 

#    values   ind 
#1   Carex.nigra Dwarf.Shrub 
#2  Empetrum.nigrum Dwarf.Shrub 
#3  Agrostis.canina Graminoid 
#4 Deschampsia.flexuosa Graminoid 

이제 두 데이터 프레임에서 키의 변수 이름을 제공하는 dplyr과 결합하십시오.

library(dplyr) 
left_join(df, df2, by=c("variable" = "values")) 

# Year Type  variable value veg.type 
#1 2016 T Agrostis.canina  6 Graminoid 
#2 2016 R Agrostis.canina  2 Graminoid 
#3 2016 Q Agrostis.canina  0 Graminoid 
#4 2016 T  Carex.nigra  0 Dwarf Shrub 
# etc 
+0

내 환경의 각 veg.type에 대한 목록이 있거나 그 중 데이터 프레임을 사용할 수 있습니다. 제공 한 데이터 프레임에 표시된 것과 마찬가지로 각 veg.type에 여러 변수가 있습니다. 나는 그것과 같은 데이터 프레임을'합치거나'합칠 수 없다고 생각합니다. – dunnns

+0

하나 이상의 변수로 참여할 수 있습니다. 예를 들어 [이 답변] (http://stackoverflow.com/a/40185522/4477364)을 참조하십시오. 목록에서 조회 데이터 프레임을 만들고 여러 변수로 결합하고자하는 것 같습니다. – Joe

+0

그건 내가 의미하는 바가 아닙니다. 위에 도움이 될만한 의견을 남겼습니다. 기본적으로 각 veg.type은 변수의 하위 집합이며 각 veg.tye 아래 변수 목록이 있습니다. 예 : 'Dwarf.shrub <- c ("Calluna.vulgaris", "Empetrum.nigrum", "Erica. cinerea "...) Graminoid <- c ("Agrostis.canina ","Deschampsia.flexuosa ","Holcus.lanatus "...) 아마 데이터를 먼저 서브 세트해야합니다. – dunnns

0
library(data.table) 
output.df <- merge(df1, df2, by="variable", all.x=T) 

all.x 매개 변수는 모든 행을 df1에 보관한다는 것을 의미합니다. 당신은 원한다면 모두 할 수도 있습니다. 또한 여러 열을 병합하려는 경우 다음을 사용하여 'by'매개 변수를 확장 할 수 있습니다.

by=c("param 1 name","param 2 name",...) 

희망이 있습니다.

1

가장 간단한 룩업 테이블을 사용하는 것입니다 (당신은 merge 할 필요가 없습니다) :

lookup <- list(Agrostis.canina="Graminoid", 
       Carex.nigra="Dwarf.shrub") 
df$value <- lookup[df$variable] 
0

내가 내 솔루션을 게시 할 것이라고 생각 : 나는 left_join을 사용

을 @Joe가 제안했습니다. 각 변수에 포함 된 여러 값의 "조회"데이터 프레임이 있었지만 원래의 데이터 프레임은 오히려 넓은 형식이 아니 었습니다. gather 함수를 tidyr에 사용하여 긴 형식을 만들었습니다. 즉, ID 변수 열을 그대로 유지하지 않고 데이터 프레임을 변형 할 수 있다는 의미였습니다. reshape2melt 함수에서 필요로하는 것처럼 보입니다.

여러분 모두 도와 주셔서 감사합니다.

+0

당신을 진심으로 환영합니다. 대답 중 하나를 받아들이고 유용하게 사용 된 모든 것을 upvoting하는 것을 고려하십시오. :-) – Joe

+0

죄송합니다, 진드기가 당신이 대답을 어떻게 받아 드리는지를 잊었습니다! (oops) – dunnns