跨数据框的特定列逐行连接
Posted
技术标签:
【中文标题】跨数据框的特定列逐行连接【英文标题】:Concatenate row-wise across specific columns of dataframe 【发布时间】:2011-09-12 15:06:06 【问题描述】:我有一个包含列的数据框,当将这些列连接(按行)作为字符串时,我可以将数据框划分为所需的形式。
> 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 ...
对于每一行,我想将 F、E、D 和 C 列中的数据连接成一个字符串(下划线字符作为分隔符)。以下是我对此的不成功尝试:
data$id <- sapply(as.data.frame(cbind(data$F,data$E,data$D,data$C)), paste, sep="_")
下面是不想要的结果:
> 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"
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:试试
data$id <- paste(data$F, data$E, data$D, data$C, sep="_")
相反。矢量化代码的美妙之处在于您不需要逐行循环或循环等效的 *apply 函数。
编辑更好的是
data <- within(data, id <- paste(F, E, D, C, sep=""))
【讨论】:
哇。那是快速和正确的。看起来我过于复杂了这个过程。我真的想摆脱完全的“循环依赖”,并且仍在学习欣赏矢量化代码。 试试with(data, paste(...))
更简洁。
正确。甚至within()
作为with()
不那么受欢迎的表亲。相应地修改了我的答案。
这就是within
的不同之处!?! (为什么不叫with(..., modify=TRUE)
?)
如果您奇怪地使用data$id <- paste(data[, c(1)], data[,c(2)])
怎么办,那么代码并没有达到预期的效果。我在这里缺少什么吗?【参考方案2】:
使用unite
的tidyr
包:
require(tidyr)
data <- data %>% unite(id, F, E, D, C, sep = '_')
第一个参数是所需的名称,紧接sep
- 要连接的列。
【讨论】:
当我需要按组折叠动态向量时,这种方法是唯一一种始终如一的方法mycols <- c("F","E","D","C") data <- data %>% unite_("id", mycols, sep = "_")
【参考方案3】:
stringr::str_c()
或 paste()
都可以。
require(stringr)
data <- within(data, str_c(F,E,D,C, sep="_")
否则
data <- within(data, paste(F,E,D,C, sep="_")
(stringr
在大型数据集上性能更好)
【讨论】:
@the serial downvoter:stringr::str_c
可以使用,没有人这么说。你有什么问题?以上是关于跨数据框的特定列逐行连接的主要内容,如果未能解决你的问题,请参考以下文章