在R中连接具有相似名称的多个行

时间:2018-02-18 00:22:02

标签: r string-concatenation

我有一个带有30个变量的数据帧db1。在这30个中,有10个具有顺序名称 - X1,X2,...... X10。所有这些X变量都是字符。我想连接所有这些。所以我当然可以做到

db1$new <- paste(X1, X2, X3, X4, X5, X6, X7, X8, X9, X10)

但是,这并不好玩,如果我有一个包含不同数量X变量的新文件,则此代码将无效。所以,我需要一些使用变量名连接的方法。我试过了

zz1 <- paste(grep('^X',names(db1), value = TRUE))
zz2 <- paste("db1$",zz1,sep="",collapse = ",")

第二个声明是用逗号分隔变量名。然后我尝试使用

进行合并
db1$new <- paste(db1$Terms,zz2,collapse = ","))

这不起作用,因为R不理解zz2是文件名。我该怎么办?

3 个答案:

答案 0 :(得分:2)

一种选择可以是使用select_中的dplyr,然后是apply

#data
db1 <- data.frame(id = 1:2, x1 = c("a", "b"), x2 = c("a", "b"),
                  x3 = c("a", "b"))

library(tidyverse)

db1$new <- db1 %>% 
select_(.dots = grep("^x\\d+",names(db1), value = T)) %>%
apply(1,paste,collapse="") 

db1
# Result
#  id x1 x2 x3 new
#1  1  a  a  a aaa
#2  2  b  b  b bbb

答案 1 :(得分:2)

tidyrdplyr的一种方式:

library(dplyr)
library(tidyr)

unite(db1, "var", starts_with("x"), sep = "")

#   var z1
# 1 aaa  a
# 2 bbb  b

这将unite任意starts_with“x”列,并将结果存储在名为var的变量中。

如果数据的结构使得其他变量以“x”开头并不感兴趣(例如“xvar”)并且不应该连接,那么您可以用{{1}替换starts_with并使用正则表达式。感谢MKR的建议:

matches

数据:

unite(db1, "var", matches("^x\\d+"), sep = "")

#   var z1 xvar
# 1 aaa  a    a
# 2 bbb  b    b

答案 2 :(得分:1)

do.callpaste0一起使用,如下所示,使用如下数据集(使用@MKR数据):

df <- structure(list(id = 1:2, X1 = c("a", "b"), X2 = c("a", "b"), 
        X3 = c("a", "b")), .Names = c("id", 
    "X1", "X2", "X3"), row.names = c(NA, -2L), class = "data.frame")

df$pastecol = do.call("paste0",df[,grep("^X\\d+$",names(df))])

<强>输出

#> df$pastecol = do.call("paste0",df[,grep("^X\\d+$",names(df))])
#> df
#  id X1 X2 X3 pastecol
#1  1  a  a  a      aaa
#2  2  b  b  b      bbb