Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R cSplit库(splitstackshape)总是删除列_R_Splitstackshape - Fatal编程技术网

R cSplit库(splitstackshape)总是删除列

R cSplit库(splitstackshape)总是删除列,r,splitstackshape,R,Splitstackshape,我正在寻找一种通过分隔符分割列内容并将表转换为长格式的方法。我从splitstackshape包中找到了cSplit,它几乎完成了我想要的功能 现在的问题是drop选项。我希望我的拆分列以某种方式被复制,但这并没有发生。我做错了吗?有人经历过这个问题吗 我不确定我是否做错了什么,但在我的情况下,drop=FALSE选项不起作用 以下是一个例子: library(splitstackshape) jnk <- data.table(a = '1,2,3,4,5', b = 5) jnk #

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

现在的问题是
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
我使用的是1.4.2版

该“长”格式使用
列表(未列出(…)
在“data.table”中修改列,并指定
:=
。因此,如果使用了
drop
,您将拆分列,然后删除它

我将在文档中明确说明
drop
仅适用于
wide
格式,或者如果用户尝试使用长格式的
drop
,则添加一条
消息。请随意

解决方法是分配另一列(例如,“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

jnk感谢您的反馈,我编写了一个小函数作为解决方法。
我必须将
data.table
更改为
data.frame
,以使其正常工作。在
data.table
的情况下,我需要设置一个额外的参数,但它与
data.frame
崩溃。在我的例子中,我大部分时间都需要data.frame,所以我对它进行了优化

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)
库(splitstackshape)

jnk如果df中有更多行,这肯定不起作用,因为
jnk[['a']]
需要具有相同的长度,或者每次都会追加它。。。所以它不适用于
jnk-Hey@AnandaMahto也许你可以在下一个版本中添加此功能。。。在我的情况下,这将是非常有用的。据我所知,我应该可以用一行代码进行修复。我得做些测试看看。
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)
}
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)