我试图通过for循环创建一个数据帧,并试图为数据帧的每一行添加一个向量。
行是人员,列是名称类别和点类别。
例如,我正在尝试类似...
Name Points
Susie c(12,45,23)
Bill c(13,24,12,89)
CJ c(12)
到目前为止,我的代码看起来像
names_list <-c("Susie","Bill","CJ")
result = data.frame()
for (name in names_list){
listing = .....
frame = data.frame(name,listing)
names(frame) = c("name","list")
result <- rbind(result,frame)
}
列表恰好是与该名称关联的点。但是,与其为每个包含所有点的名称创建一行,它不为每个点创建多个具有相同名称的行。
结果看起来像
1 Susie 12
2 Susie 45
3 Susie 23
4 Bill 13
5 Bill 24
6 Bill 12
7 Bill 89
8 CJ 12
答案 0 :(得分:0)
我不知道向量的值在什么结构中,但是通常将向量嵌套在列中,您可以执行以下操作:
names <- c("A", "B", "C")
vectors <- list(list(1,2,3), list(4,5,6), list(7,8,9))
as.data.frame(cbind(names, vectors))
names vectors
1 A 1, 2, 3
2 B 4, 5, 6
3 C 7, 8, 9
答案 1 :(得分:0)
您遇到的特定问题是由于data.frame
展平了所有列表输入。可以使用识别功能I
防止这种情况。例如,
data.frame(a = 1, b = list(c("a", "b")))
不做你想要的,但是
data.frame(a = 1, b = I(list(c("a", "b"))))
确实。 http://r4ds.had.co.nz/many-models.html#list-columns-1
提供了有关此行为的讨论和一些替代方法。您也可以通过示例使用I
产生所需的结果:
names_list <-c("Susie","Bill","CJ")
points <- list(c(12,45,23),
c(13,24,12,89),
12)
result = data.frame()
for (i in 1:length(names_list)){
frame = data.frame(names_list[[i]], I(points[i]))
names(frame) = c("name","list")
result <- rbind(result,frame)
}
尽管评论中指出,但是有更好的方法来做到这一点。您真正需要的只是
data.frame(
name = names_list,
points = I(points))