【问题标题】:using strsplit to split a variable three ways使用 strsplit 以三种方式拆分变量
【发布时间】:2014-01-30 20:55:58
【问题描述】:

我有一个要拆分的变量...每一行都不同,但它要么有 2 个字符串表达式,由 ","; 分隔3 字符串表达式用','分隔; 1个字符串表达式;或者什么都没有

例如:

     indel
row1 +1C
row2 +1C,+2CC
row3 0
row4 +1C,+2CC,-1C

基本上我想做的是为可能的三个字符串表达式中的每一个创建 3 个不同的变量。当然,有些行会有 2、1 或没有。

我已经能够使用以下方法为前两个字符串表达式拆分并创建两个不同的变量:

mito$indel1 <- sapply(strsplit(as.character(mito$indel),","),function(x) x[1])
mito$indel2 <- sapply(strsplit(as.character(mito$indel),","),function(x) x[2])

当然,还有第三个字符串表达式。我正在考虑创建一个临时 indel2 变量,然后将其再次拆分为第三个,但使用上面的 R 脚本的问题在于它将变量创建为:

     indel         Indel1    Indel2
row1 +1C           +1C       NA
row2 +1C,+2CC      +1C       +2CC
row3 0             0         NA
row4 +1C,+2T,-1C   +1C       +2T

我确定这与字符串中的第二个“,”有关,并且 R 感到困惑。但是有没有办法克服这个问题,而不必为每一行编辑整个变量。

我也尝试了以下方法,但没有成功:

mito$indel2 <- sapply(strsplit(sapply(strsplit(as.character(mito$indel),","),function(x) x[2]),","),function(x) x[1])
mito$indel3 <- sapply(strsplit(sapply(strsplit(as.character(mito$indel),","),function(x) x[2]),","),function(x) x[2])

任何帮助将不胜感激。

【问题讨论】:

  • mito$indel3 &lt;- sapply(strsplit(as.character(mito$indel),","),function(x) x[3]) 没有完成你想要的吗?
  • 通常这会起作用,但不知何故它不适用于这种情况。可能我在某个地方做错了什么,但我会再试一次..

标签: r strsplit


【解决方案1】:

您也可以为此使用read.table

read.table(text=as.character(dat$V1), sep=',', fill=TRUE, as.is=TRUE)
#    V1   V2  V3
# 1 +1C         
# 2 +1C +2CC    
# 3   0         
# 4 +1C +2CC -1C

【讨论】:

  • @BrandonBertelsen 同样,我已经看过很多次了,当我需要它时从未想到过。
  • @TylerRinker,但是,如果您查看 read.concat 的代码,主要是这样 :-) 主要区别在于 read.concat 依赖于 count.fields,因为我的经验是这种格式的很多数据不一定在前几行数据中具有正确数量的字段。
【解决方案2】:

也许是splitstackshape 包:

library(splitstackshape)
dat <- read.table(text="+1C
+1C,+2CC
0
+1C,+2CC,-1C", header=FALSE)

splitstackshape:::read.concat(dat[, 1], "var", ",")

##  var_1 var_2 var_3
## 1   +1C            
## 2   +1C  +2CC      
## 3     0            
## 4   +1C  +2CC   -1C

第二种基本方法,但@Matthew's 是一种更好的方法:

dat2 <- strsplit(as.character(dat[, 1]), ",")
lens <- sapply(dat2, length)
max(lens)
do.call(rbind, lapply(dat2, function(x) {
    x[max(lens)  + 1] <- NA
    x
}))[, -c(max(lens) + 1)]

##      [,1]  [,2]   [,3] 
## [1,] "+1C" NA     NA   
## [2,] "+1C" "+2CC" NA   
## [3,] "0"   NA     NA   
## [4,] "+1C" "+2CC" "-1C"

【讨论】:

  • 但是让你的代码依赖于非导出函数并不是一个好主意。
  • @flodel 我不同意。我会说包是的,但要编写分析代码,嗯。但是,我希望 Ananda Mahto 在这里权衡一下为什么 read.concat 没有被导出,而是在文档中显示了一堆。
  • concat.split(data = dat, split.col = "V1", drop = TRUE)
  • @flodel 和 Tyler,Henrik 的用途更符合我的想法(它是 concat.split 函数的两个版本的辅助函数),这就是我没有导出它的原因。因为我觉得它很有帮助,所以我还为它创建了一个文档页面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 2017-06-16
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
相关资源
最近更新 更多