2017-11-28 6 views
0

이 명령으로 데이터 프레임 목록을 만들었습니다. testlist에는 파일 이름이 들어 있습니다.R 데이터 프레임 목록 - 모든 항목에서 특정 열을 선택하는 방법?

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 

그래서 I 7 dataframes의리스트가 상기 예에서와 같이 각이 동일한 구조를 갖는다. 목록의 모든 데이터 프레임은 63 개의 열을 가지고 있으며 이제 3 번째 열의 모든 두 번째 열을 선택하고 날씨가 < = 0인지 확인하려고합니다. 그렇다면 바로 앞에 열을 제거하고 싶습니다.

예를 들어 3 열에 -1 값이 있으면 2 열의 항목을 NA 또는 -999로 설정하고 싶습니다.

나는이 만든 :

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

을하지만 이것은 단지 첫 번째 항목에 대해 노력하고 있습니다. 내가 데려 갈 때, [[1]] 나는 오류 메시지가이 같은 목록에있는 모든 dataframes 위해 그것을 사용하려는 :

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

가 어떻게 목록에있는 모든 dataframe를 선택할 수 있습니다? 그리고 값이 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) 
+0

당신은 당신의 데이터에'dput'를 사용하는 사람들이 놀 수있는 뭔가가 있도록 게시해야합니다. 여기에 효과가 있을지 모르지만 테스트 할 데이터를 만들지는 않습니다. (data_list [[i]] [, 0]) data_list [[i]] <- data_list [[i]] [, - 2]}' – CCurtis

+0

나는 dput을 사용하는 방법을 알지 못한다. 내가 가지고있는 파일은 거대하다. 그래서 나는 testset을 만드는 것이 더 좋은 생각이라고 생각한다. 나는 하나를 추가 할 것이다! 아, 코드가 작동하지 않으면 다음 오류 메시지가 나타납니다. 경고 메시지 : 1 : if (data_list [[i]] [, 3] <= 0) data_list [[i]] <- data_list [[i]] [, : 조건의 길이가 1 이상이고 첫 번째 요소 만 사용됩니다 – Essi

답변

0

이 나를 위해 잘 작동 : 여기

내의 구조를 가지고 testlist입니다.

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 
+0

감사합니다! 그것은 정말로 작동한다! 나는 결코 나 자신에 의해 그것을 관리하지 않고 있었을 것이다! 당신의 도움을 주셔서 감사합니다! – Essi