[英]How to paste factor labels conditionally in R
希望有人可以帮我解决这个问题,为此我自己找到了一个糟糕的解决方案:我想将四列( A
到D
)的标签聚合(或粘贴)到第五列( dream
),但有条件的是,仅当其数值为2时。
这是我的数据库df
:
id= c(1:12)
A = c(2,NA,NA,2,NA,1,1,1,1,1,NA,2)
B = c(2,1,1,1,2,NA,1,1,1,1,2,1)
C = c(2,1,1,1,2,NA,1,1,1,1,NA,1)
D = c(2,1,1,1,1,1,2,1,1,NA,2,1)
df = data.frame(id,A,B,C,D) ; df
df$A=factor(df$A, labels=c("no", "i saw"))
df$B=factor(df$B, labels=c("no", "someone"))
df$C=factor(df$C, labels=c("no", "sitting"))
df$D=factor(df$D, labels=c("no", "on a cloud")) ; df
这是我找到的解决方案的下方,但并不令人满意...
df$dream = ifelse(as.numeric(df$A)!=2, NA, as.character(df$A)) ; df
df$dream = ifelse(as.numeric(df$B)!=2, df$dream, paste(df$dream, as.character(df$B))) ; df
df$dream = ifelse(as.numeric(df$C)!=2, df$dream, paste(df$dream, as.character(df$C))) ; df
df$dream = ifelse(as.numeric(df$D)!=2, df$dream, paste(df$dream, as.character(df$D))) ; df
我敢肯定有一种直接的方法可以做到这一点,此外,我的代码似乎甚至无法以这种方式工作。有人可以帮助我吗? 谢谢
我认为,如果你改变你会更容易data.frame
在data.table
。
对于column B
您可以使用
dt <- as.data.table(df)
dt[,dream:=ifelse(B==2,"someone",ifelse(B==1,"no",NA))]
然后为其余3 columns
复制相同的内容。 我希望这有帮助
UPDATE
也许您可以尝试一下
dt$dream.A <- mapvalues(dt$A,c(1,2),c("no", "i saw"))
此解决方案将起作用,但您必须声明要从因子粘贴的值的向量。
# init empty result vector
dream <- character(nrow(df))
# values from each column (A-D) you want to paste
values <- c("i saw","someone","sitting", "on a cloud")
# iterate over each row
for(i in seq_len(nrow(df))){
#paste values from each row
dream[i] <- paste(values[which(as.numeric(df[i,-1]) == 2)], collapse=" ")
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.