排序data.table向量内的列表

时间:2012-12-05 23:45:00

标签: r data.table

我有一个字符串数据表,我试图将其转换为列表并排序而不对矢量本身进行排序:

> DT <- data.table(x=c("A11, A12, A41",
+                      "A11, A41, B11, A6, A21",
+                      "A41, A12",
+                      "A12, A41",
+                      "A12, A6, B41, A93"));DT
                        x
1:          A11, A12, A41
2: A11, A41, B11, A6, A21
3:               A41, A12
4:               A12, A41
5:      A12, A6, B41, A93

我需要:

                        x
1:          A11, A12, A41
2: A11, A21, A41, A6, B11
3:               A12, A41
4:               A12, A41
5:      A12, A6, A93, B41

我尝试过使用一堆order ing,as.listsdata.frames,以及我尝试编写的data.table函数:

sortlists <- function(DT,col){
  for(i in 1:length(DT[,col])){
    DT[i,col]=order(DT[i,col])
  }
}

会抛出我的列位置大于ncol(x)的错误。无论如何,必须有更好的方法来获得我想要的结果。我是R的新手,对data.tables非常陌生(因为我听过很好的东西,所以我想更多地恭喜)所以任何帮助都会非常感激!

1 个答案:

答案 0 :(得分:5)

这将分割字符向量,然后排序并返回每行的列表

 DT[, list(y =  lapply(strsplit(x,', '), sort))]
                    y
1:        A11,A12,A41
2: A11,A21,A41,A6,B11
3:            A12,A41
4:            A12,A41
5:     A12,A6,A93,B41

和。如果你真的想要每行的单个字符串

DT[, list(y =  vapply(strsplit(x,', '), function(x) paste(sort(x), collapse = ', '), FUN.VALUE =character(1)))]