【问题标题】: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"

任何帮助将不胜感激。

【问题讨论】:

    标签: r apply paste string-concatenation sapply


    【解决方案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 &lt;- paste(data[, c(1)], data[,c(2)]) 怎么办,那么代码并没有达到预期的效果。我在这里缺少什么吗?
    【解决方案2】:

    使用unitetidyr 包:

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

    第一个参数是所需的名称,紧接sep - 要连接的列。

    【讨论】:

    • 当我需要按组折叠动态向量时,这种方法是唯一一种始终如一的方法mycols &lt;- c("F","E","D","C") data &lt;- data %&gt;% 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 可以使用,没有人这么说。你有什么问题?
    猜你喜欢
    • 2015-04-28
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 2016-12-30
    • 2020-08-11
    相关资源
    最近更新 更多