例如,我有一个玩具数据集,就像我在下面创建的那样,
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
的值为其分配值a2
或NA
或v
。因此,'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))
答案 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])])]