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