Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R使用lappy()填充和命名数据帧列表中的一列_R_List_Dataframe_Lapply_Names - Fatal编程技术网

R使用lappy()填充和命名数据帧列表中的一列

R使用lappy()填充和命名数据帧列表中的一列,r,list,dataframe,lapply,names,R,List,Dataframe,Lapply,Names,在搜索了一段时间后,我找不到平滑的R型解 我有一个要转换为数据帧的向量列表,并添加一个包含向量名称的列。我不能用cbind和melt来实现这一点,因为存在具有不同行数的向量 基本的例子是: 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)){

在搜索了一段时间后,我找不到平滑的R型解

我有一个要转换为数据帧的向量列表,并添加一个包含向量名称的列。我不能用cbind和melt来实现这一点,因为存在具有不同行数的向量

基本的例子是:

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
}
但我正试图更好地使用Lappy,并有更干净的编码实践。现在我非常依赖for和if语句,很多基函数都已经在使用这些语句了,而且比我现在编写代码的效率要高得多

我想要的psuedo代码类似于:

list<-lapply(list, function(x) data.frame(num=x,get(var)=names(x))
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'
有没有干净的方法来完成这件事

第二个密切相关的问题是,如果我已经有了一个数据帧列表,为什么使用lappy重新分配列值和名称如此困难

因此,使用类似于:

list<-lapply(list, function(x) data.frame(num=x,get(var)=names(x))
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'
第一行伪代码抛出一个关于匹配行长度的错误。为什么Lappy不象for循环中单个数据帧上的相同函数那样循环并重复namesx

对于第二行,据我所知,我可以使用setNames来重新分配所有的列名,但是如何仅为其中一个列名执行此操作呢


非常感谢您提供的任何想法或指向其他线程,帮助我理解Lappy在这方面的行为。

关于您的第一个/主要问题,您可以使用tibble包中的函数enframe实现此目的

library(tibble)
library(tidyr)
library(dplyr)

l<-list(a=c(1,2,3),b=c(4,5,6,7))

l %>% 
  enframe(name = "group", value="value") %>% 
  unnest(value) %>% 
  group_split(group)
试试这个:

library(dplyr)
mylist <- list(a = c(1,2,3), b = c(4,5,6,7))
bind_rows(lapply(names(mylist), function(x) tibble(grp = x, num = mylist[[x]])))
# A tibble: 7 x 2
  grp     num
  <chr> <dbl>
1 a         1
2 a         2
3 a         3
4 b         4
5 b         5
6 b         6
7 b         7
话虽如此,TIBLES作为data.frames的现代实现是首选,bind_行优于do.callrbind。。。构造

关于第二个问题,请注意以下几点:

lapply(mylist, function(x) str(x))
 num [1:3] 1 2 3
 num [1:4] 4 5 6 7
....
lapply(mylist, function(x) names(x))
$a
NULL
$b
NULL
names(c(1,2,3))
NULL
这里您看到的是lappy内部的函数获取mylist的元素。在这种情况下,需要使用数值向量。就lappy内部调用的函数而言,它没有任何名称。要强调这一点,请考虑以下内容:

lapply(mylist, function(x) str(x))
 num [1:3] 1 2 3
 num [1:4] 4 5 6 7
....
lapply(mylist, function(x) names(x))
$a
NULL
$b
NULL
names(c(1,2,3))
NULL

这是相同的:向量c1,2,3没有名称属性

不使用循环的全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

请小心使用内置函数和对象命名对象,例如list。@coffeinjunky,当然可以,谢谢。只是想做个例子。不过,我会更好。