首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cSplit库(拆分堆栈形状)总是删除列

cSplit库(拆分堆栈形状)总是删除列
EN

Stack Overflow用户
提问于 2015-05-13 06:45:19
回答 2查看 5.5K关注 0票数 8

我正在寻找一种通过分隔符分割列内容并将表转换为长格式的方法。我从cSplit包中找到了splitstackshape,它几乎完成了我想要的东西。

现在的问题是drop选项。我预期我的拆分列会以某种方式被复制,但这种情况并没有发生。我做错了吗?有人经历过这个问题?

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

下面是一个示例:

代码语言:javascript
复制
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

我所期待的是这样的事情:

代码语言:javascript
复制
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版本

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-13 07:00:36

“长”格式使用list(unlist(...))在"data.table“中修改列,该列与:=一起分配。因此,如果使用drop,您将拆分该列,然后删除它!

我将尝试在文档中明确说明drop只适用于wide格式,或者如果用户试图以长格式使用drop,则添加message。欢迎访问提交FR或提交PR

解决办法是分配另一列(例如"a_orig"),然后执行拆分:

代码语言:javascript
复制
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

我还没有进行广泛的测试,但可能的解决办法是:

代码语言:javascript
复制
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情况下更改输入数据集。这与您的想法类似,但可能是集成到实际包中的解决方案,就在第94行的某个地方。在这种情况下,应该只需要indt[, `:=`(eval(paste(splitCols, "orig", sep = "_")), lapply(splitCols, function(x) indt[[x]]))]部分。

票数 10
EN

Stack Overflow用户

发布于 2015-05-13 07:29:45

谢谢你的反馈,我写了一个小函数作为解决办法。为了使它正常工作,我不得不将data.table转换为data.frame。对于data.table,我需要设置一个额外的参数,但它会与data.frame崩溃。在我的情况下,我大部分时间都需要data.frame,所以我对它进行了优化。

代码语言:javascript
复制
library(splitstackshape)
jnk <- data.frame(a = c('1,2,3,4,5','1,2,3','2,3'),
                  b = c('a,b,c,d,e','a,b,c','a,b'),
                  c = c(5,4,3))
jnk

myCSplit <- function(data_set, splitCols, sep = ',', direction = 'long', drop = TRUE, ...) {
  if(direction == 'long' & !drop) {
    orig_names <- sub('$', '_orig', splitCols)
    df <- as.data.frame(data_set[,splitCols])
    names(df) <- orig_names
    df2 <- cbind(data_set, df)
    return(cSplit(df2, splitCols, sep, 'long'))
  } else {
    return(cSplit(data_set, splitCols, sep, direction, drop = drop,...))
  }
}
myCSplit(jnk, 'a', ',')
myCSplit(jnk, 'a', ',', drop = FALSE)
myCSplit(jnk, 'a', ',', 'wide')
myCSplit(jnk, 'a', ',', 'wide', drop = FALSE)
myCSplit(jnk, c('a','b'), ',', 'long', drop = FALSE)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30207500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档