R 如何对作为数据框的列表元素进行简单操作?
我有一个列表,它的每个元素都是数据框。列表的每个元素中的数据框的维度(行数)彼此不同,如下所示:R 如何对作为数据框的列表元素进行简单操作?,r,dataframe,R,Dataframe,我有一个列表,它的每个元素都是数据框。列表的每个元素中的数据框的维度(行数)彼此不同,如下所示: for(i in 1:length(nm)){print(dim(ismr2[[i]]))} [1] 510 3 [1] 477 3 [1] 412 3 [1] 422 3 [1] 455 3 [1] 398 3 [1] 405 3 [1] 407 3 [1] 452 3 [1] 462 3 [1] 498 3 [1] 495 3 [1] 469
for(i in 1:length(nm)){print(dim(ismr2[[i]]))}
[1] 510 3
[1] 477 3
[1] 412 3
[1] 422 3
[1] 455 3
[1] 398 3
[1] 405 3
[1] 407 3
[1] 452 3
[1] 462 3
[1] 498 3
[1] 495 3
[1] 469 3
[1] 470 3
但有一条规则,所有行名称都是行数最大的数据帧的行名称的子集(例如这里的510)
我的目标是找到行数最大的数据帧(我们称之为reference数据帧),并将其他数据帧添加到缺少的行(reference数据帧中的行,但不在其他数据帧中的行)
预期产出:
1) 一个列表,其中的每个元素都是数据帧
2) 属于数据框的列表的所有元素都具有相同的维度。维度应等于引用数据框的维度。(引用数据框是列表中行数最大的元素)
3) 新添加到数据框中以具有相同维度的行应具有参考数据框中的行名称,并且具有0条目
这是我的努力,但没有成功:
isomir2 # original list
ismr3 <- vector("list", length(isomir2))
# find the refrence data frame: it give me just the data fram with larget dimension, I don't know which data frame is it (which element of list)
length.max <- max(unlist(lapply(isomir2, function(x) nrow(x))))
for (i in 1:length(isomir2)){
ismr3[[i]] <- rbind(isomir2[[i]],matrix(0,ncol=3,nrow=length.max - nrow(isomir2[[i]]))
temp <- rownames(isomir2[[i]])
rownames(P[[i]]) <- c(temp, # How should I find the missing row name here ? ))
}
预期产出:
> P
[[1]]
[,1]
A 1
B 2
C 3
D 4
[[2]]
[,1]
A 1
B 2
D 3
C 0
[[3]]
[,1]
B 1
C 2
D 0
A 0
首先,我在数据所在的表单上生成一些无意义的数据(因为您没有提供任何示例数据集) 现在,
ismr3
的所有帧的行数相同,命名如下:
> sapply(ismr3, row.names)
[,1] [,2] [,3] [,4] [,5]
[1,] "B" "D" "B" "F" "F"
[2,] "A" "B" "D" "G" "C"
[3,] "F" "A" "F" "D" "H"
[4,] "C" "C" "A" "E" "D"
[5,] "H" "F" "E" "A" "E"
[6,] "D" "H" "C" "B" "B"
[7,] "E" "E" "H" "C" "A"
[8,] "I" "I" "I" "H" "I"
[9,] "J" "J" "J" "I" "J"
[10,] "G" "G" "G" "J" "G"
如果您不想进行插补(即从参考帧中获取缺少的行),而是让它们成为0
(或者更合适地说是NA
?),您可以这样做
lapply(ismr2, function(x){
rn <- union(rownames(x), rownames(ref))
x <- x[rn,]
x[is.na(x)] <- 0 # Remove this line to let missing rows be NA
rownames(x) <- rn
x
})
lappy(ismr2,函数(x){
rn#如果您不关心行名称
#这适用于具有多列的data.frames
#这不会添加空列
l=列表()
l[[1]]=data.frame(1:4)#请注意,double[[]]很重要,否则它将存储为向量或列表中的列表,而不是列表中的data.frame
l[[2]]=数据帧(1:3)
l[[3]]=数据帧(1:2)
l[[4]]=数据帧(1:4)
#检查最大的
大小=0
用于(1中的i:长度(l)){
如果(尺寸(l[[i]])[1]>尺寸){
尺寸=尺寸(l[[i]])[1]
}
}
#添加空行
emptyValue=0
用于(1中的i:长度(l)){
if(dim(l[[i]])[1]如果数据中没有重复项:dat您确定data.frame中有一致的行吗?我的意思是,让我们假设data.frame中有477行的所有行也在data.frame中有510行?加上您想要做的事情?联合?基本上,最后我想要一个与原始列表长度相同的列表。但是列表中的每个元素都是dat一个框架应该具有相同的维度。它不起作用。基本上,在运行代码之后,我列表中的所有元素,即数据框架,都应该具有相同的行号。代码工作正常,因此我怀疑您的数据有问题。所有行的名称是否都应该命名?您能为我和其他人发布一个小的exmaple数据集来测试我们的解决方案吗ns on?当然,所有行名称都应该来自引用数据框行名称,有一点是错误的,即您添加的新行的值应该为零,我的意思是它们的坐标应该为零。@Baklin,我添加了这个示例
ref <- ismr2[[which.max(sapply(ismr2, nrow))]]
ismr3 <- lapply(ismr2, function(x){
rbind(x, ref[!rownames(ref) %in% rownames(x),])
})
> sapply(ismr3, row.names)
[,1] [,2] [,3] [,4] [,5]
[1,] "B" "D" "B" "F" "F"
[2,] "A" "B" "D" "G" "C"
[3,] "F" "A" "F" "D" "H"
[4,] "C" "C" "A" "E" "D"
[5,] "H" "F" "E" "A" "E"
[6,] "D" "H" "C" "B" "B"
[7,] "E" "E" "H" "C" "A"
[8,] "I" "I" "I" "H" "I"
[9,] "J" "J" "J" "I" "J"
[10,] "G" "G" "G" "J" "G"
lapply(ismr2, function(x){
rn <- union(rownames(x), rownames(ref))
x <- x[rn,]
x[is.na(x)] <- 0 # Remove this line to let missing rows be NA
rownames(x) <- rn
x
})
# if you dont care about row names
# this works for data.frames with multiple columns
# this does not add empty columns
l=list()
l[[1]]=data.frame(1:4) # note that double [[]] are important else it will be stored as a vector or list in list instead of data.frame in list
l[[2]]=data.frame(1:3)
l[[3]]=data.frame(1:2)
l[[4]]=data.frame(1:4)
# check biggest
size=0
for(i in 1:length(l)){
if (dim(l[[i]])[1]>size) {
size=dim(l[[i]])[1]
}
}
# add empty rows
emptyValue=0
for(i in 1:length(l)){
if(dim(l[[i]])[1]<size){
l[[i]][dim(l[[i]])[1]:size,]=emptyValue
}
}
l