【问题标题】:Selecting delimited data in one column of data.table based on positional values in another根据另一列中的位置值在 data.table 的一列中选择分隔数据
【发布时间】:2014-05-15 09:13:17
【问题描述】:

我有一个数据表

x<-data.table(col1=rep("hello,how,are,you",4),col2=1:4)
              col1 col2
1: hello,how,are,you    1
2: hello,how,are,you    2
3: hello,how,are,you    3
4: hello,how,are,you    4

现在我需要根据 col2 中的值从 col1 中选择值。如何在 data.table 的 j 中执行此操作?

最终数据应如下所示

                 col1 col2   col3
1: hello,how,are,you    1    hello
2: hello,how,are,you    2    how
3: hello,how,are,you    3    are
4: hello,how,are,you    4    you

【问题讨论】:

  • 在您的真实数据集中,col1 单词是否也总是用逗号分隔?
  • 您可能想看看strplit() 函数,然后循环遍历行,或者使用apply() 函数。

标签: r data.table


【解决方案1】:

我不知道这是否是最有效的(速度还是内存是最重要的问题?)解决方案:

library(data.table)
x <- data.table(col1=c(rep("hello,how,are,you",3), 
                       "Lirum, Larum, Löffel, Stiel"),
                col2=1:4)
x[, ind := .I]
x[, col3 := strsplit(col1, ",", fixed=TRUE)]
x[, col4 := col3[[1]][col2], by=ind]

#                           col1 col2 ind                        col3   col4
# 1:           hello,how,are,you    1   1           hello,how,are,you  hello
# 2:           hello,how,are,you    2   2           hello,how,are,you    how
# 3:           hello,how,are,you    3   3           hello,how,are,you    are
# 4: Lirum, Larum, Löffel, Stiel    4   4 Lirum, Larum, Löffel, Stiel  Stiel

【讨论】:

  • 谢谢 Roland,这正是我想要的,你能告诉我为什么你使用 by=ind。如果我不使用“by=ind”,就好像列表中只有一个元素是“hello,how,are,you”。也许这个问题令人困惑,让我澄清一下,据我所知,如果没有提供明确的 by 语句 data.table 将保持数据完整,即单个组,我在这里错了吗?
  • by=ind 通过ind 中的每组唯一值进行操作。由于ind 是行索引,因此对每一行都进行了操作(即,这相当于apply(x, 1, somefun) 的速度更快)
【解决方案2】:

这是另一个选项,它将strsplit 的结果组合成一个矩阵,然后使用矩阵子集:

x <- data.table(col1=rep("hello,how,are,you",4),col2=1:4)

x[, col3 := do.call(rbind, strsplit(col1, split = ",", fixed = TRUE))
               [matrix(c(1:.N, col2), ncol = 2)]]
x
#                col1 col2  col3
#1: hello,how,are,you    1 hello
#2: hello,how,are,you    2   how
#3: hello,how,are,you    3   are
#4: hello,how,are,you    4   you

【讨论】:

  • 如果分隔数据不是矩形,这将不起作用
【解决方案3】:

我希望以下内容对您有用...

解决方案1:如果col1没有固定字长

col1 = c(paste(c('hello','how','are','you'),1,sep='-',collapse=','),
         paste(c('hello','how','are','you'),2,sep='-',collapse=','),
         paste(c('hello','how','are','you'),3,sep='-',collapse=','),
         paste(c('hello','how','are','you'),4,sep='-',collapse=','))

x<-data.table(col1=col1,col2=1:4)
x$col3 = NA
for(i in 1:nrow(x)){
  x$col3[i] = strsplit(x$col1[i],',')[[1]][x$col2[i]]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 2020-09-26
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多