Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.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 不重复地拆分列_R - Fatal编程技术网

R 不重复地拆分列

R 不重复地拆分列,r,R,我有一个数据框,其中有一列我想拆分成几列,但是拆分的数量在所有行中都是动态的 Var1 ==== A/B A/B/C C/B A/C/D/E 我尝试过使用colsplit(df$Var1,split=“/”,names=c(“Var1”、“Var2”、“Var3”、“Var4”)),但变量少于4的行将重复 Hansi的预期输出为: Var1 Var2 Var3 Var4 [1,] "A" "B" NA NA [2,] "A" "B" "C" NA [3,] "C

我有一个数据框,其中有一列我想拆分成几列,但是拆分的数量在所有行中都是动态的

Var1
====
A/B
A/B/C
C/B
A/C/D/E
我尝试过使用
colsplit(df$Var1,split=“/”,names=c(“Var1”、“Var2”、“Var3”、“Var4”))
,但变量少于4的行将重复

Hansi的预期输出为:

     Var1 Var2 Var3 Var4
[1,] "A"  "B"  NA   NA  
[2,] "A"  "B"  "C"  NA  
[3,] "C"  "B"  NA   NA  
[4,] "A"  "C"  "D"  "E" 

如果我正确理解了您的目标,这里有一个可能的解决方案,我相信有更好的方法,但这是我首先想到的:

a <- data.frame(Var1=c("A/B","A/B/C","C/B","A/C/D/E"))
splitNames <- c("Var1","Var2","Var3","Var4")

# R> a
     # Var1
# 1     A/B
# 2   A/B/C
# 3     C/B
# 4 A/C/D/E

b <- t(apply(a,1,function(x){
    temp <- unlist(strsplit(x,"/"));
    return(c(temp,rep(NA,max(0,length(splitNames)-length(temp)))))
}))
colnames(b) <- splitNames

# R> b
     # Var1 Var2 Var3 Var4
# [1,] "A"  "B"  NA   NA  
# [2,] "A"  "B"  "C"  NA  
# [3,] "C"  "B"  NA   NA  
# [4,] "A"  "C"  "D"  "E" 

a我不知道有什么函数可以解决您的问题,但您可以使用标准的R命令轻松实现:

# Here are your data
df <- data.frame(Var1=c("A/B", "A/B/C", "C/B", "A/C/D/E"), stringsAsFactors=FALSE)

# Split
rows <- strsplit(df$Var1, split="/")

# Maximum amount of columns
columnCount <- max(sapply(rows, length))

# Fill with NA
rows <- lapply(rows, `length<-`, columnCount)

# Coerce to data.frame
out <- as.data.frame(rows)

# Transpose
out <- t(out)
#这是您的数据
df
只能使用
colClasses=“character”


a期望的输出是什么样子的?谢谢,这正是我想要做的。正如我所说的“更好的方法”:)+1我应该承认这是我从Gabor Grothendieck那里学到的一个技巧。在我提供的示例数据上,这似乎非常有效,但当我在实际数据帧上测试它时,它似乎是垂直填充的,而不是水平填充的。你知道为什么会这样吗?如果这有关系的话,实际数据中的数字都是以前导零代替字母的。在所有数字字段中前导零可能是一个棘手的问题。您可能需要添加colClasses=“character”,也可以将as.is=TRUE添加到read.table设置中。我不确定“垂直填充”是什么意思。我所说的“垂直填充”是指将A/B拆分为第1行和第2行,而不是第1列和第2列,我想类似于melt()。再次感谢。
> read.table(text=as.character(df$Var1), sep="/", fill=TRUE)
  V1 V2 V3 V4
1  A  B      
2  A  B  C   
3  C  B      
4  A  C  D  E
a <- data.frame(Var1=c("01/B","04/B/C","0098/B","8708/C/D/E"))
read.table(text=as.character(a$Var1), sep="/", fill=TRUE, colClasses="character")
    V1 V2 V3 V4
1   01  B      
2   04  B  C   
3 0098  B      
4 8708  C  D  E