Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R为什么粘贴要用数字替换字符?_R - Fatal编程技术网

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

在这个给定的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    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(),他可能有兴趣保存这个步骤)