gpt4 book ai didi

r - cSplit 库(splitstackshape)总是删除列

转载 作者:行者123 更新时间:2023-12-04 06:59:16 25 4
gpt4 key购买 nike

我正在寻找一种通过分隔符拆分列内容并将表格转换为长格式的方法。我找到了 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 版

最佳答案

“长”格式使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com