有人可以帮我解决这个问题吗?任何建议都非常感谢!
我开始时:
A <- data.frame(stringsAsFactors = F)
A <- edit(A)
Run Code Online (Sandbox Code Playgroud)
然后我为A填写了一些值,所以它看起来像这样:
A
var1 var2
1 a x,y,z
2 b p,q
3 c g,h
Run Code Online (Sandbox Code Playgroud)
我的目标是以这种形式获得数据框:
var1 var2
1 a x
2 a y
3 a z
4 b p
5 b q
6 c g
7 c h
Run Code Online (Sandbox Code Playgroud)
这就是我尝试实现它的方式:
A2 <- data.frame(stringsAsFactors = F)
for(i in 1:nrow(A)){
if(grepl(",", A[i,2])){
split <- unlist(strsplit(A[i,2], ","))
for(j in 1:length(split)){
newrow <- c(A[i,1],split[j])
A2 <- rbind(A2, newrow)
}
}else{
A2 <- rbind(A2, A[i,])
}
}
Run Code Online (Sandbox Code Playgroud)
但我收到警告消息:
Warning messages:
1: In `[<-.factor`(`*tmp*`, ri, value = "y") :
invalid factor level, NA generated
2: In `[<-.factor`(`*tmp*`, ri, value = "z") :
invalid factor level, NA generated
3: In `[<-.factor`(`*tmp*`, ri, value = "b") :
invalid factor level, NA generated
4: In `[<-.factor`(`*tmp*`, ri, value = "p") :
invalid factor level, NA generated
5: In `[<-.factor`(`*tmp*`, ri, value = "b") :
invalid factor level, NA generated
6: In `[<-.factor`(`*tmp*`, ri, value = "q") :
invalid factor level, NA generated
7: In `[<-.factor`(`*tmp*`, ri, value = "c") :
invalid factor level, NA generated
8: In `[<-.factor`(`*tmp*`, ri, value = "g") :
invalid factor level, NA generated
9: In `[<-.factor`(`*tmp*`, ri, value = "c") :
invalid factor level, NA generated
10: In `[<-.factor`(`*tmp*`, ri, value = "h") :
invalid factor level, NA generated
Run Code Online (Sandbox Code Playgroud)
你的问题是,这stringsAsFactors不是一个data.frame记得的财产.这仅在初始data.frame创建期间使用,并适用于作为参数传递的所有值.它根本不会影响您可能添加的未来值.
此外,您将遇到rbind没有列的data.frame 问题.R喜欢确保列名称匹配,如果使用,rbind并且显然不是这种情况.另外,当您rbind使用data.frame时,它会将对象转换为data.frame,然后尝试添加该值,但这次您无法设置,stringsAsFactors因此它使用默认值(TRUE).您将使用字符列显式创建自己的data.frame.这是你可以重写循环的一种方法
A2 <- data.frame(var1=character(), var2=character(), stringsAsFactors = F)
for(i in 1:nrow(A)){
if(grepl(",", A[i,2])){
split <- unlist(strsplit(A[i,2], ","))
for(j in 1:length(split)){
newrow <- c(var1=A[i,1],var2=split[j])
A2 <- rbind(A2, data.frame(as.list(newrow), stringsAsFactors=F))
}
}else{
A2 <- rbind(A2, A[i,])
}
}
Run Code Online (Sandbox Code Playgroud)
话虽这么说,如果你不介意依赖,cSplit辅助函数对这类东西很有用data.table.
您可能也会这样做
A2 <- do.call(rbind, with(A, Map(expand.grid,
var1 = var1,
var2 = strsplit(var2, ",")
)))
Run Code Online (Sandbox Code Playgroud)
使用基函数来执行与基函数的拆分和绑定,而无需循环.