如何根据数据框中变量的名称生成新变量

时间:2017-10-01 08:27:19

标签: r vectorization

例如,我有一个玩具数据集,就像我在下面创建的那样,

 a1<-1:10
 a2<-11:20
 v<-c(1,2,1,NA,2,1,2,1,2,1)
 data<-data.frame(a1,a2,v,stringsAsFactors = F)

然后我想要创建一个新变量y,根据变量a1的值为其分配值a2NAv 。因此,'y' 应该等于1 12 3 NA 15 6 17 8 19 10

我想使用类似于下面列出的命令生成它,它不起作用,我想这是因为矢量化问题,那我该如何解决呢?

实际上,我有几个a,比如10,实际值是字符而不是数字。

 data$y[!is.na(data$v)]<-data[,paste0('a',data$v)]

 data%>%
 mutate(y=ifelse(!is.na(v),get(paste0('a',v)),NA))

3 个答案:

答案 0 :(得分:2)

您可以对import String from './String' let string = new String(); 使用标准索引:

cbind

结果:

dat$y <- dat[cbind(1:nrow(dat), dat$v)]

(我使用> dat a1 a2 v y 1 1 11 1 1 2 2 12 2 12 3 3 13 1 3 4 4 14 NA NA 5 5 15 2 15 6 6 16 1 6 7 7 17 2 17 8 8 18 1 8 9 9 19 2 19 10 10 20 1 10 代替dat,因为将数据框调用为函数是不明智的;请参阅data

答案 1 :(得分:1)

只有想到我的想法:

 data%>%
       mutate(y=ifelse(!is.na(v),paste0('a',v),NA)) %>%
       mutate(z=ifelse(!is.na(y),(ifelse(y=="a1",get("a1"),get("a2"))),NA))

   a1 a2  v    y  z
1   1 11  1   a1  1
2   2 12  2   a2 12
3   3 13  1   a1  3
4   4 14 NA <NA> NA
5   5 15  2   a2 15
6   6 16  1   a1  6
7   7 17  2   a2 17
8   8 18  1   a1  8
9   9 19  2   a2 19
10 10 20  1   a1 10

或更直接:

data%>%
   mutate(y=ifelse(!is.na(v),(ifelse(v==1, get("a1"),get("a2"))),NA))

   a1 a2  v  y
1   1 11  1  1
2   2 12  2 12
3   3 13  1  3
4   4 14 NA NA
5   5 15  2 15
6   6 16  1  6
7   7 17  2 17
8   8 18  1  8
9   9 19  2 19
10 10 20  1 10

仍然基于ifelse :(

答案 2 :(得分:0)

您需要使用矩阵访问器:

# Get the indices of missing values
ind <- which(!is.na(data$v))
# Transform colnames to indices
tab <- structure(match(c("a1", "a2"), names(data)), .Names = c("a1", "a2"))
# Access data with a matrix accessor
data$y[ind] <- data[cbind(ind, tab[paste0('a', data$v[ind])])]