如何在R

时间:2018-07-12 14:16:20

标签: r

我试图通过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

2 个答案:

答案 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))