合并R中的两个因子列
您好,我在R中遇到了一些问题。我正在尝试在一个数据帧中合并(合并?)两个(因子)列。对于每一行,只有一列中有一个值,我希望将它们合并,以便所有行都有一个值。作为一个简化的示例,假设我运行了以下代码:合并R中的两个因子列,r,merge,R,Merge,您好,我在R中遇到了一些问题。我正在尝试在一个数据帧中合并(合并?)两个(因子)列。对于每一行,只有一列中有一个值,我希望将它们合并,以便所有行都有一个值。作为一个简化的示例,假设我运行了以下代码:df出现这些数字的原因是因为data.frame包含因子: 检查?data.frame,尤其是参数stringsAsFactors df <- data.frame(x=c("a", "b", " ", " "), y=c(" ", " ", "q", " "
df出现这些数字的原因是因为data.frame包含因子:
检查?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)
df在示例数据集中,有三列。当存在多个列时,可以使用以下方法。(这里,我假设每行中只有一个“值”)
如果每行有多个“值”,则可以将这些值粘贴在一起toString
是粘贴(,,collapse=“,”)的包装器
或者您可以melt
数据集,然后使用aggregate
粘贴值
library(reshape2)
aggregate(value~Var1, subset(melt(as.matrix(df)), value!= ' '),
toString)$value
数据
df请确保您的输入df(四行,三列)与输出(三行,两列)匹配。我喜欢您的答案。但我相信你的答案假设它是一个只有X列的数据帧,它们都应该合并。你能展示你的第一个例子的一个修改版本来展示我如何使用索引从X列合并到Z列吗?@JimBeam在这种情况下,只为那些列设置子集,即df[c(“X”,“Z”)][cbind(1:nrow(df),max.col(df[c(“X”,“Z”)!=”,“first”)]
或为列设置子集的数字索引。
x y merged
1 a 2
2 b 3
3 q 2
df <- data.frame(x=c("a", "b", " ", " "),
y=c(" ", " ", "q", " "),
z=c(" ", " ", " ", "p"),
stringsAsFactors = FALSE)
df$merged = ifelse(df$x == " ", df$y, df$x)
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"
apply(df,1, function(x) toString(x[x!=' ']))
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"))