[英]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
tidyr
和dplyr
一種方法:
library(dplyr)
library(tidyr)
unite(db1, "var", starts_with("x"), sep = "")
# var z1
# 1 aaa a
# 2 bbb b
這會將所有starts_with
“ x” starts_with
列starts_with
unite
, starts_with
結果存儲在名為var
的變量中。
如果數據的結構是這樣,有起有“X”表示不感興趣(如“XVAR”)其他變量,不應該連在一起,那么你就可以代替starts_with
與matches
和使用正則表達式。 感謝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.call
與paste0
一起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.