我正在寻找一种通过分隔符拆分列内容并将表转换为长格式的方法。我从cSplit包中找到了splitstackshape,它几乎可以满足我的要求。

现在问题出在drop选项上。我希望以某种方式复制我的拆分列,但这不会发生。我做错了吗?有人遇到了问题吗?

我不确定是否做错了什么,但是drop = FALSE选项在我的情况下不起作用。

这是一个例子:

library(splitstackshape)
jnk <- data.table(a = '1,2,3,4,5', b = 5)
jnk
#            a b
# 1: 1,2,3,4,5 5

cSplit(jnk, 'a', ',', 'long', drop = FALSE)
#    a b
# 1: 1 5
# 2: 2 5
# 3: 3 5
# 4: 4 5
# 5: 5 5

我所期望的是这样的:
cSplit(jnk, 'a', ',', 'long', drop = FALSE)
#    a b    a.orig
# 1: 1 5 1,2,3,4,5
# 2: 2 5 1,2,3,4,5
# 3: 3 5 1,2,3,4,5
# 4: 4 5 1,2,3,4,5
# 5: 5 5 1,2,3,4,5

我正在使用1.4.2版

最佳答案

“long”格式使用分配给list(unlist(...))的“data.table”中的:=修改列。因此,如果使用drop,则将拆分该列,然后将其删除!

我会尝试在文档中明确指出drop仅适用于wide格式,如果用户尝试使用长格式的message,则添加drop。随意file a FR or submit a PR

解决方法是分配另一列(例如“a_orig”),然后进行拆分:

jnk <- data.table(a=c('1,2,3,4,5','1,2,3','2,3'),b=c(5,4,3))
cSplit(jnk[, a_orig := a], "a", ",", "long")
#     a b    a_orig
#  1: 1 5 1,2,3,4,5
#  2: 2 5 1,2,3,4,5
#  3: 3 5 1,2,3,4,5
#  4: 4 5 1,2,3,4,5
#  5: 5 5 1,2,3,4,5
#  6: 1 4     1,2,3
#  7: 2 4     1,2,3
#  8: 3 4     1,2,3
#  9: 2 3       2,3
# 10: 3 3       2,3

我尚未进行广泛的测试,但可能的解决方法可能是:
cSplit2 <- function(indt, splitCols, sep = ",", direction = "wide",
                    fixed = TRUE, drop = TRUE, stripWhite = TRUE,
                    makeEqual = NULL, type.convert = TRUE) {
  if (direction == "long" & !drop) {
    indt <- as.data.table(indt)
    indt[, `:=`(eval(paste(splitCols, "orig", sep = "_")),
                lapply(splitCols, function(x) indt[[x]]))]
  }
  cSplit(indt, splitCols, sep, direction, fixed, drop, stripWhite,
         makeEqual, type.convert)
}

基本思想是仅更改direction == "wide"drop = FALSE的输入数据集。这与您的想法类似,但是可能是将解决方案集成到实际包中,位于line 94周围。在这种情况下,只需要indt[, `:=`(eval(paste(splitCols, "orig", sep = "_")), lapply(splitCols, function(x) indt[[x]]))]部分。

关于r - cSplit库(splitstackshape)总是删除列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30207500/

10-16 15:05