R 使用 lapply() 来填充和命名数据框列表中的一列

标签 r list dataframe lapply names

找了一段时间后,我找不到一个流畅的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/

相关文章:

r - 使用 R 绘制事件序列数据图表

r - 如何绘制 SVM 分类超平面

python - 如何覆盖 list[1 :10]? 中的 [] 运算符

python - 如何打印没有前导 'shape' 信息的 Polars 数据帧

python - 根据另一个数据帧列值将数据帧列和行合并到特定索引

r - R中如何获取行索引号?

r - 插入符号中的 AUPRC 和 PRROC 之间的区别

python - SHAP 摘要图和平均值一起显示

python - 基于子数组的第二个元素对多维数组进行排序

list - 如何在Robot Framework中将全局变量或套件变量设置为列表?