跨数据帧的特定列逐行连接

Jub*_*les 26 r string-concatenation paste apply sapply

我有一个带有列的数据框,当作为字符串连接(行方式)时,将允许我将数据框分区为所需的形式.

> str(data)
'data.frame':   680420 obs. of  10 variables:
 $ A              : chr  "2011-01-26" "2011-01-26" "2011-02-09" "2011-02-09" ...
 $ B              : chr  "2011-01-26" "2011-01-27" "2011-02-09" "2011-02-10" ...
 $ C              : chr  "2011-01-26" "2011-01-26" "2011-02-09" "2011-02-09" ...
 $ D              : chr  "AAA" "AAA" "BCB" "CCC" ...
 $ E              : chr  "A00001" "A00002" "B00002" "B00001" ...
 $ F              : int  9 9 37 37 37 37 191 191 191 191 ...
 $ G              : int  NA NA NA NA NA NA NA NA NA NA ...
 $ H              : int  4 4 4 4 4 4 4 4 4 4 ...
Run Code Online (Sandbox Code Playgroud)

对于每一行,我想将F,E,D和C列中的数据连接成一个字符串(下划线字符作为分隔符).以下是我未能成功的尝试:

data$id <- sapply(as.data.frame(cbind(data$F,data$E,data$D,data$C)), paste, sep="_")
Run Code Online (Sandbox Code Playgroud)

以下是不良后果:

  > str(data)
    'data.frame':   680420 obs. of  10 variables:
     $ A              : chr  "2011-01-26" "2011-01-26" "2011-02-09" "2011-02-09" ...
     $ B              : chr  "2011-01-26" "2011-01-27" "2011-02-09" "2011-02-10" ...
     $ C              : chr  "2011-01-26" "2011-01-26" "2011-02-09" "2011-02-09" ...
     $ D              : chr  "AAA" "AAA" "BCB" "CCC" ...
     $ E              : chr  "A00001" "A00002" "B00002" "B00001" ...
     $ F              : int  9 9 37 37 37 37 191 191 191 191 ...
     $ G              : int  NA NA NA NA NA NA NA NA NA NA ...
     $ H              : int  4 4 4 4 4 4 4 4 4 4 ...
     $ id             : chr [1:680420, 1:4] "9" "9" "37" "37" ...
      ..- attr(*, "dimnames")=List of 2
      .. ..$ : NULL
      .. ..$ : chr  "V1" "V2" "V3" "V4"
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

Dir*_*tel 54

尝试

 data$id <- paste(data$F, data$E, data$D, data$C, sep="_")
Run Code Online (Sandbox Code Playgroud)

代替.矢量化代码的优点在于您不需要逐行循环或循环等效*应用函数.

编辑 更好的是

 data <- within(data,  id <- paste(F, E, D, C, sep=""))
Run Code Online (Sandbox Code Playgroud)

  • 正确.或者甚至是`in()`作为`with()`中不太受欢迎的堂兄.相应地修改了我的答案. (5认同)
  • 并尝试`with(data,paste(...))`以获得更简洁。 (2认同)
  • 这就是"内部"的差异!?!(为什么地狱不是用(......,modify = TRUE)命名的?) (2认同)

Jel*_*ina 9

使用unitetidyr包:

require(tidyr)
data <- data %>% unite(id, F, E, D, C, sep = '_')
Run Code Online (Sandbox Code Playgroud)

第一个参数是所需的名称,接下来是sep- 要连接的列.

  • 当我需要按组折叠动态矢量时,这种方法是唯一一个始终如一地工作的方法`mycols < - c("F","E","D","C")数据< - data%>% unite _("id",mycols,sep ="_")` (3认同)

smc*_*mci 5

无论是stringr::str_c()paste()将起作用。

require(stringr)
data <- within(data, str_c(F,E,D,C, sep="_")
Run Code Online (Sandbox Code Playgroud)

要不然

data <- within(data, paste(F,E,D,C, sep="_")
Run Code Online (Sandbox Code Playgroud)

stringr在大型数据集上表现更好)