在这个给定的R代码中......
df1 <- c("a","b","a","b","b","c","b","c","c","d","c","d")
dim(df1) = c(4,3)
df1 <- as.data.frame(t(df1))
for (i in 1:nrow(df1)) {
df1[i,"paste"] <- paste(df1[i,!names(df1) %in% c("paste")],collapse="")
}
......我期待看到:
V1 V2 V3 V4 paste
a b a b abab
b c b c bcbc
c d c d cdcd
......但我正在看:
V1 V2 V3 V4 paste
a b a b 1111
b c b c 2222
c d c d 3333
这似乎微不足道,我不明白代码有什么问题。任何人都可以解释我的代码如何产生给定的输出?另外,关于如何产生我想要的简单输出的任何其他想法?感谢。
答案 0 :(得分:2)
使用unite()
的另一个选项,一个方便的功能,将多个列粘贴到一个,tidyr
library(tidyr)
unite(df1, paste, V1:V4, sep = "", remove = FALSE)
给出了:
# paste V1 V2 V3 V4
#1 abab a b a b
#2 bcbc b c b c
#3 cdcd c d c d
答案 1 :(得分:1)
原因是df1[i,!names(df1) %in% c("paste")]
返回一个数据框。您可以取消列出数据框,以使paste
正常工作:
for (i in 1:nrow(df1)) {
df1[i,"paste"] <- paste(unlist(df1[i,!names(df1) %in% c("paste")]),collapse="")
# ^^^^^^
}
df1
# V1 V2 V3 V4 paste
#1 a b a b abab
#2 b c b c bcbc
#3 c d c d cdcd
如果paste
包含因子变量,则df1
对数据框的处理方式如下:
paste(df1[1:4], collapse = "")
# [1] "1:31:31:31:3"
作为替代方案,这也适用于您:
df1$paste = do.call(paste0, df1[1:4])
答案 2 :(得分:1)
使用dplyr可能更易读的代码,没有for循环:
df1 %>%
mutate(paste = paste0(V1,V2,V3,V4))