将列表附加到R中的数据框

Nic*_*bel 5 r list append dataframe rbind

我在R中创建了一个带有两列的空数据框:

d<-data.frame(id=c(), numobs=c())
Run Code Online (Sandbox Code Playgroud)

我想用一个列表附加这个数据框(在一个循环中),d1它有输出:

[1] 1  100
Run Code Online (Sandbox Code Playgroud)

我试过用rbind:

d<-rbind(d, d2)
Run Code Online (Sandbox Code Playgroud)

并且merge:

d<-merge(d, d2)
Run Code Online (Sandbox Code Playgroud)

我甚至尝试制作列表列表,然后将其转换为数据帧,然后给出数据帧名称:

d<-rbind(dlist1, dlist2)
dframe<-data.frame(d)
names(dframe)<-c("id","numobs")
Run Code Online (Sandbox Code Playgroud)

但是这些似乎都不符合例程检查器的标准(这是针对一个类),它给出了错误:

Error: all(names(cc) %in% c("id", "nobs")) is not TRUE
Run Code Online (Sandbox Code Playgroud)

即使它在我的工作区中工作正常.

这是令人沮丧的,因为错误没有揭示错误发生的位置.

任何人都可以帮我合并2个数据帧或附加数据框与列表?

avi*_*seR 6

rbind我认为您混淆了和的目的merge垂直rbind附加 data.frames 或命名列表或两者。同时水平组合 data.frames 。merge

vector您似乎也对's 和list's感到困惑。在 R 中,list每个元素可以采用不同的数据类型,但vector所有元素必须具有相同的类型。和list都是vector一维的。当您使用时rbind,您想要附加一个命名的 list而不是一个命名/未命名的vector

未命名向量和列表

定义 a 的方式vector是使用函数c()定义未命名列表的方式是使用list()函数,如下所示:

vec1 = c(1, 10)
# > vec1
# [1]  1 10

list1 = list(1, 10)
# > list1
# [[1]]
# [1] 1
# 
# [[2]]
# [1] 10
Run Code Online (Sandbox Code Playgroud)

请注意, 和vec1都有list1两个元素,但list1将两个数字存储为两个单独的向量(元素为[[1]]向量c(1)[[2]]向量c(10)

命名向量和列表

您还可以创建命名向量和列表。您可以通过以下方式执行此操作:

vec2 = c(id = 1, numobs = 10)
# > vec2
# id numobs 
# 1     10

list2 = list(id = 1, numobs = 10)
# > list2
# $id
# [1] 1
# 
# $numobs
# [1] 10
Run Code Online (Sandbox Code Playgroud)

两者的数据结构相同,但元素已命名。

数据框作为列表

请注意,每个元素名称前面都有list2$这可能会给您一些线索,data.frame实际上 slist的每一列都是 的元素list,因为df$column通常用于从数据帧中提取列。这是有道理的,因为list's 和data.frame's 都可以采用不同的数据类型,这与vectors's 不同。

功能rbind

当您的第一个元素是数据框时,rbind要求您要附加的内容与数据框的列具有相同的名称。现在,命名vector将不起作用,因为 a 的元素vector不被视为数据帧的列,而list如果名称相同,命名则将元素与列匹配:

展示:

d<-data.frame(id=c(), numobs=c())

rbind(d, c(1, 10))
#   X1 X10
# 1  1  10

rbind(d, c(id = 1, numobs = 10))
#   X1 X10
# 1  1  10

rbind(d, list(1, 10))
#   X1 X10
# 1  1  10

rbind(d, list(id = 1, numobs = 10))
#   id numobs
# 1  1     10
Run Code Online (Sandbox Code Playgroud)

了解上述内容后,很明显,您当然也可以使用rbind两个列名匹配的数据框:

df2 = data.frame(id = 1, numobs = 10)

rbind(d, df2)
#   id numobs
# 1  1     10
Run Code Online (Sandbox Code Playgroud)


42-*_*42- 0

d2 对象被打印为原子向量。也许如果您向我们展示 dput(d2) 或 str(d2) 您会对 R 列表有更好的理解。此外,代码的第一位也不会产生两列数据帧。

> d<-data.frame(id=1, numobs=1)[0, ]             # 2-cl dataframe with 0 rows
> dput(d)
structure(list(id = numeric(0), numobs = numeric(0)), .Names = c("id", 
"numobs"), row.names = integer(0), class = "data.frame")
> d2 <- list(id="fifty three", numobs=6)          # names that match names(d)
> rbind(d,d2)
           id numobs
2 fifty three      6
Run Code Online (Sandbox Code Playgroud)