R为什么粘贴用数字替换字符?

时间:2016-09-06 15:47:34

标签: r

在这个给定的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

这似乎微不足道,我不明白代码有什么问题。任何人都可以解释我的代码如何产生给定的输出?另外,关于如何产生我想要的简单输出的任何其他想法?感谢。

3 个答案:

答案 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))