R数据帧列表 - 如何在每个条目中选择某些列?

时间:2017-11-28 16:22:18

标签: r list select dataframe

我使用此命令创建了一个数据框列表,testlist包含文件的名称。

data_list = lapply(testlist, read.table)

它看起来像这样:

[[1]]

V1          V2       V3      V4    V5     V6      V7     V8     V9    
1992-01-01  12.062   -1    1.225    1     5.750    1     2.400   0

所以我有一个包含7个数据帧的列表,每个数据帧具有与示例中所示相同的结构。列表中的每个数据帧都有63列,现在我想从第3列开始选择第2列并查看天气< = 0。如果是,我想删除它前面的列。

因此,例如,如果第3列具有-1值,我想将第2列中的条目设置为NA或-999。

我创造了这个:

data_list[[1]][, seq (from=3, to=63, by=2)]

但这只适用于第一次进入。当我拿走[[1]]并希望将它用于列表中的所有数据帧时,我收到一条错误消息:

data_list[, seq (from=3, to=63, by=2)]
Error in data_list[, seq(from = 3, to = 63, by = 2)] : incorrect number of dimensions

如何选择列表中的每个数据框?当它们的值小于或等于0时,如何删除所选列前面的列?

这是一个测试列表,具有我的结构:

V1= c("20000608", "20000609", "20000610", "20000611", "20000612", "20000613")
V2= seq(5, 30, length=6)
V3= rep(c(-1,0,1), times=2) 
V4= seq(10, 60, length=6) 
V5= rep(c(1,-1,0), times=2) 

testframe1 = data.frame(V1, V2, V3, V4, V5) 

x1= c("20030608", "20100609", "20060610", "20040611", "20009612", "20002613")
x2= seq(4, 80, length=6)
x3= rep(c(0,-1,1), times=2) 
x4= seq(3, 60, length=6) 
x5= rep(c(-1,1,0), times=2) 

testframe2 = data.frame(V1=x1, V2=x2, V3=x3, V4=x4, V5=x5) 

a1= c("20030602", "20100606", "20060610", "20040511", "20007612", "20002624")
a2= seq(7, 133, length=6)
a3= rep(c(-1,0,1), times=2) 
a4= seq(9, 47, length=6) 
a5= rep(c(1,0,-1), times=2) 

testframe3 = data.frame(V1=a1, V2=a2, V3=a3, V4=a4, V5=a5) 

list = list(testframe1, testframe2, testframe3)

1 个答案:

答案 0 :(得分:0)

这对我来说很好。

for(i in 1:length(data_list)){
x2=data_list[[i]][,c(FALSE,TRUE)]
x2[data_list[[i]][,c(TRUE,FALSE)][,-1]<=0]<-NA
data_list[[i]][,c(FALSE,TRUE)]<-x2}

您也可以使用lapply

lapply(data_list,function(x){
x2=x[,c(FALSE,TRUE)]
x2[x[,c(TRUE,FALSE)][,-1]<=0]<-NA
x[,c(FALSE,TRUE)]<-x2
x})

<强>结果

>data_list
[[1]]
        V1 V2 V3 V4 V5
1 20000608 NA -1 10  1
2 20000609 NA  0 NA -1
3 20000610 15  1 NA  0
4 20000611 NA -1 40  1
5 20000612 NA  0 NA -1
6 20000613 30  1 NA  0

[[2]]
        V1   V2 V3   V4 V5
1 20030608   NA  0   NA -1
2 20100609   NA -1 14.4  1
3 20060610 34.4  1   NA  0
4 20040611   NA  0   NA -1
5 20009612   NA -1 48.6  1
6 20002613 80.0  1   NA  0

[[3]]
        V1    V2 V3   V4 V5
1 20030602    NA -1  9.0  1
2 20100606    NA  0   NA  0
3 20060610  57.4  1   NA -1
4 20040511    NA -1 31.8  1
5 20007612    NA  0   NA  0
6 20002624 133.0  1   NA -1