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个数据帧或附加数据框与列表?
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)
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)
| 归档时间: |
|
| 查看次数: |
10722 次 |
| 最近记录: |