嗨我在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
我遇到的所有其他有用信息都适用于数字,但不适用于字符。我到目前为止的尝试是否正确?
这似乎是一个简单的问题,但我一直无法找到解决方案。任何帮助,将不胜感激。
谢谢大家。
答案 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
一起使用这些值。 toString
是paste(., 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
。