找了一段时间后,我找不到一个流畅的R-esque解决方案。
我有一个向量列表,我想将其转换为数据帧并添加一个包含向量名称的列。我不能用 cbind() 和 melt() 对单个数据帧执行此操作 b/c 存在具有不同行数的向量。
基本示例是:
list<-list(a=c(1,2,3),b=c(4,5,6,7))
var<-"group"
我的想法和工作是:
list<-lapply(list, function(x) data.frame(num=x,grp=""))
for (j in 1:length(list)){
list[[j]][,2]<-names(list[j])
names(list[[j]])[2]<-var
}
但我正在尝试更好地使用 lapply() 并拥有更清晰的编码实践。现在,我非常依赖 for 和 if 语句,许多基本函数已经这样做了,而且比我现在编写代码的效率要高得多。
我想要的伪代码是这样的:
list<-lapply(list, function(x) data.frame(num=x,get(var)=names(x))
有没有一种干净的方法来完成这项工作?
第二个密切相关的问题,如果我已经有了数据框列表,为什么使用 lapply() 重新分配列值和名称如此困难?
所以使用类似的东西:
list<-list(a=data.frame(num=c(1,2,3),grp=""),b=data.frame(num=c(4,5,6,7),grp=""))
var<-"group"
#pseudo code
list<-lapply(list, function(x) x[,2]<-names(x)) #populate second col with name of df[x]
list<-lapply(list, function(x) names[[x]][2]<-var) #set 2nd col name to 'var'
第一行伪代码抛出关于匹配行长度的错误。为什么 lapply() 不像单个数据帧上的相同函数在 for 循环中那样循环并重复 names(x)?
对于第二行,据我所知,我可以使用 setNames() 来重新分配所有的列名,但是我如何只对其中一个列名进行这项工作?
非常感谢任何想法或指向涵盖此内容的其他线程并帮助我理解 lapply() 在这种情况下的行为。
最佳答案
不使用循环的完整 R 基础方法
> l<-list(a=c(1,2,3),b=c(4,5,6,7))
> data.frame(grp=rep(names(l), lengths(l)), num=unlist(l), row.names = NULL)
grp num
1 a 1
2 a 2
3 a 3
4 b 4
5 b 5
6 b 6
关于R 使用 lapply() 来填充和命名数据框列表中的一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56011595/