簡體   English   中英

在R中串聯具有相似名稱的多行

[英]Concatenating multiple rows with similar names in R

我有一個說30個變量的數據框db1。 在這30個中,有十個具有順序名稱-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是文件名,因此無法使用。 我能做什么?

一種選擇是使用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

tidyrdplyr一種方法:

library(dplyr)
library(tidyr)

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

#   var z1
# 1 aaa  a
# 2 bbb  b

這會將所有starts_with “ x” starts_withstarts_with unitestarts_with結果存儲在名為var的變量中。

如果數據的結構是這樣,有起有“X”表示不感興趣(如“XVAR”)其他變量,不應該連在一起,那么你就可以代替starts_withmatches和使用正則表達式。 感謝MKR的建議:

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

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

數據:

db1 <- data.frame(x1 = c("a", "b"), 
                  x2 = c("a", "b"),
                  z1 = c("a", "b"),
                  x3 = c("a", "b"))

do.callpaste0一起paste0 ,如下所示,使用如下數據集(使用@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM