R为什么粘贴要用数字替换字符?
在这个给定的R代码中R为什么粘贴要用数字替换字符?,r,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 V
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 1111
b c b c 2222
c d c d 3333
这看起来很琐碎,我不明白代码出了什么问题。有人能解释一下我的代码是如何产生给定输出的吗?还有,关于如何产生我想要的简单输出的其他想法吗?谢谢。原因是%c(“粘贴”)中的
df1[i,!names(df1)%
返回一个数据帧。您可以取消列出数据框,以便粘贴
正常工作:
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
作为替代方案,这也适用于您:
df1$paste = do.call(paste0, df1[1:4])
原因是%c(“粘贴”)中的
df1[i,!names(df1)%
返回一个数据帧。您可以取消列出数据框,以便粘贴
正常工作:
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
作为替代方案,这也适用于您:
df1$paste = do.call(paste0, df1[1:4])
使用dplyr的代码可能更可读,没有for循环:
df1 %>%
mutate(paste = paste0(V1,V2,V3,V4))
使用dplyr的代码可能更可读,没有for循环:
df1 %>%
mutate(paste = paste0(V1,V2,V3,V4))
另一个选项是使用
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
另一个选项是使用
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
str(df1)
将显示这些变量是因子,这或多或少意味着它们是以字母为标签的整数。使用df1和(df1,paste0(V1,V2,V3,V4))
str(df1)
将显示这些变量是因子,这或多或少意味着它们是以字母为标签的整数。将df1与(df1,paste0(V1,V2,V3,V4))一起使用。我喜欢原始的,它没有提及原始的列名。(我的问题是从给我一个数据帧的情况下概括出来的,所以“stringsAsFactors”对我来说不起作用,或者任何代码都是按名称引用列的。你的unlist
解决方案是完美的。)还有一种选择:df1$paste@Tensibai我认为这会将列粘贴在一起,而不是将行粘贴在一起。@Psidom确实,我编辑了评论,因为它可能对OP有用(因为他刚开始使用t(),他可能对保存这一步感兴趣),这很有用-谢谢。我喜欢原始的,它没有提及原始的列名。(我的问题是从给我一个数据帧的情况下概括出来的,所以“stringsAsFactors”对我来说不起作用,或者任何代码都是按名称引用列的。你的unlist
解决方案是完美的。)还有一种选择:df1$paste@Tensibai我认为这会将列粘贴在一起,而不是将行粘贴在一起。@Psidom确实,我编辑了评论,因为它可能对OP有用(因为他一开始使用的是t(),他可能有兴趣保存这个步骤)