如何在R中有条件地粘贴因子标签

时间:2017-05-01 09:58:40

标签: r conditional concatenation paste

希望有人可以帮我解决这个问题,我刚刚找到了一个糟糕的解决方案:我想将四列标记(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

我确信有一种直接的方法可以做到这一点,此外我的代码甚至似乎都没有这样做..有人能帮帮我吗?谢谢

2 个答案:

答案 0 :(得分:1)

我认为如果你在predict[]中转换data.frame,会更容易。

对于data.table,您可以使用

column B

然后为其余dt <- as.data.table(df) dt[,dream:=ifelse(B==2,"someone",ifelse(B==1,"no",NA))] 复制相同内容。我希望这有帮助

<强>更新

或许你可以试试这个

3 columns

答案 1 :(得分:1)

此解决方案可行,但您必须声明要从因子中粘贴的此值向量。

# 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=" ")  
}