合并R中的两个因子列

时间:2015-01-26 06:20:45

标签: r merge

嗨我在R中遇到问题。我试图在数据帧中合并(合并?)两个(因子)列。对于每一行,只有一列中有一个值,我想组合它们,以便所有行都有一个值。作为一个简化示例,假设我运行以下代码:df <- data.frame(x=c("a", "b", " ", " "), y=c(" ", " ", "q", " "), z=c(" ", " ", " ", "p")),我得到以下数据框

    x   y
1   a   
2   b        
3       q

合并x和y列后,结果为

  x y merged
1 a        a
2 b        b
3   q      q

我尝试过使用df$merged = ifelse(df$x == " ", df$y, df$x),但它给了我这些数字。知道他们的意思吗?

  x y merged
1 a        2
2 b        3
3   q      2

我遇到的所有其他有用信息都适用于数字,但不适用于字符。我到目前为止的尝试是否正确?

这似乎是一个简单的问题,但我一直无法找到解决方案。任何帮助,将不胜感激。

谢谢大家。

2 个答案:

答案 0 :(得分:2)

在您的示例数据集中,有三列。当存在多个列时,可以使用以下方法。 (在这里,我假设你只有一个&#34;值&#34;在每一行)

df$merged <- df[cbind(1:nrow(df),max.col(df!=' ', 'first'))]
df
#  x y z merged
#1 a          a
#2 b          b
#3   q        q
#4     p      p

或者循环方法是:

apply(df, 1, function(x) x[x!=' '])
#[1] "a" "b" "q" "p"

如果有多个&#34;值&#34;每行,您可以paste一起使用这些值。 toStringpaste(., collapse=", ")

的包装器
apply(df,1, function(x) toString(x[x!=' ']))

或者您可以melt数据集,然后使用aggregate paste

library(reshape2)
aggregate(value~Var1, subset(melt(as.matrix(df)), value!= ' '), 
                      toString)$value

数据

df <- data.frame(x=c("a", "b", " ", " "), y=c(" ", " ", "q", " "), 
                z=c(" ", " ", " ", "p"))

答案 1 :(得分:1)

出现数字的原因是因为您的data.frame包含factors
检查?data.frame,尤其是参数stringsAsFactors

df <- data.frame(x=c("a", "b", " ", " "), 
                 y=c(" ", " ", "q", " "), 
                 z=c(" ", " ", " ", "p"), 
                 stringsAsFactors = FALSE)

df$merged = ifelse(df$x == " ", df$y, df$x)

附注:对于data.frame中的漏洞,不建议使用空格" "。请改用NA