2015-02-02 3 views
3

R에서 큰 데이터 프레임으로 작업하고 있으며 데이터 프레임의 다른 변수에 저장된 제한을 초과하는 열의 수를 각 행으로 계산해야합니다.데이터 프레임의 값을 초과하는 열의 카운트 수

ID NT1 NT2 NT3 NT4 NT5 NT6 Limit1 Limit2 
1 001 1 1 1 NA NA NA  2  3 
2 002 2 1 5 4 NA NA  2  3 
3 003 3 NA 1 NA 1 NA  2  3 
4 004 3 NA 3 NA 8 NA  2  3 
5 005 4 5 1 NA NA NA  4  5 
6 006 9 9 9 NA NA 8  8  9 
7 007 1 3 5 9 NA NA  5  4 
8 008 NA NA 6 7 9 8  6  5 
9 009 1 1 NA NA NA NA  1  2 
10 010 3 4 5 5 5 5  2  2 

내가 그의 이름 NT로 시작하고 그 Limit1라는 이름의 열을 초과하는 열을 계산해야이 (내가 마지막면에 dput() 버전을 추가)처럼 내 dataframe Base 보인다. 이 값은 다른 열에 저장해야합니다. 동일한 케이스의 경우 Limit2NT으로 시작하고 Limit2의 값을 초과해야하는 열을 계산해야합니다. 결과를 새 열에 저장해야합니다. 나는 다음 코드를 사용하여 시도했지만 작동하지 않습니다 :

Base$Count1=apply(Base[c(2:7,8)],1,function(x) length(which(x>Base[8] & !is.na(x))))

또한, 그리고 중요한 사실은, Base 200000 행 60 열이 큰 dataframe의 샘플입니다. 이러한 이유로 내 apply 테스트가 완료되지 않거나 오류가 발생합니다. Count1Limit1를 초과하는 열 수를 저장

ID NT1 NT2 NT3 NT4 NT5 NT6 Limit1 Limit2 Count1 Count2 
1 001 1 1 1 NA NA NA  2  3  0  0 
2 002 2 1 5 4 NA NA  2  3  2  2 
3 003 3 NA 1 NA 1 NA  2  3  1  0 
4 004 3 NA 3 NA 8 NA  2  3  3  1 
5 005 4 5 1 NA NA NA  4  5  1  0 
6 006 9 9 9 NA NA 8  8  9  3  0 
7 007 1 3 5 9 NA NA  5  4  1  2 
8 008 NA NA 6 7 9 8  6  5  3  4 
9 009 1 1 NA NA NA NA  1  2  0  0 
10 010 3 4 5 5 5 5  2  2  6  6 

NT 시작 그들은 NA을하지 않은 :이 같은 결과를 얻을 싶습니다. Limit2을 사용하는 경우는 Count2과 동일합니다. 내 datafrmae의 dput() 버전은 다음입니다 :

Base<-structure(list(ID = c("001", "002", "003", "004", "005", "006", 
"007", "008", "009", "010"), NT1 = c(1, 2, 3, 3, 4, 9, 1, NA, 
1, 3), NT2 = c(1, 1, NA, NA, 5, 9, 3, NA, 1, 4), NT3 = c(1, 5, 
1, 3, 1, 9, 5, 6, NA, 5), NT4 = c(NA, 4, NA, NA, NA, NA, 9, 7, 
NA, 5), NT5 = c(NA, NA, 1, 8, NA, NA, NA, 9, NA, 5), NT6 = c(NA, 
NA, NA, NA, NA, 8, NA, 8, NA, 5), Limit1 = c(2, 2, 2, 2, 4, 8, 
5, 6, 1, 2), Limit2 = c(3, 3, 3, 3, 5, 9, 4, 5, 2, 2)), .Names = c("ID", 
"NT1", "NT2", "NT3", "NT4", "NT5", "NT6", "Limit1", "Limit2"), row.names = c(NA, 
-10L), class = "data.frame") 

많은 도움을 주셔서 감사합니다.

답변

1

내가 원하는대로이

ID NT1 NT2 NT3 NT4 NT5 NT6 Limit1 Limit2 Count1 Count2 
1 001 1 1 1 NA NA NA  2  3  0  0 
2 002 2 1 5 4 NA NA  2  3  2  2 
3 003 3 NA 1 NA 1 NA  2  3  1  0 
4 004 3 NA 3 NA 8 NA  2  3  3  1 
5 005 4 5 1 NA NA NA  4  5  1  0 
6 006 9 9 9 NA NA 8  8  9  3  0 
7 007 1 3 5 9 NA NA  5  4  1  2 
8 008 NA NA 6 7 9 8  6  5  3  4 
9 009 1 1 NA NA NA NA  1  2  0  0 
10 010 3 4 5 5 5 5  2  2  6  6 

을 생산

Base$Count1 <- rowSums(Base[,grep("^NT", names(Base))] > Base$Limit1, na.rm=T) 
Base$Count2 <- rowSums(Base[,grep("^NT", names(Base))] > Base$Limit2, na.rm=T) 

같은 것을 제안한다. 이 작업을 수행하려면

0

사용하고있는 코드는 약간 꺼져,이 문제를 해결

apply(Base[c(2:7, 8)],1,function(x) length(which(x>tail(x, 1) & !is.na(x)))) 

기능을 적용하는 동안, x 당신이에 운영하는 행이며, Base[8] 실제로 비교되는과 비교하기 때문에 행은 Base[8]으로, 그게 답이 꺼져있는 곳입니다.

1

당신은 큰 데이터 프레임이있는 경우, 당신이 행에 의해이 일을 피하는 게 좋을 것보다는 그냥 당신이

sapply(grep("Limit", names(df), value = TRUE), 
     function(x) rowSums(df[grepl("^NT", names(df))] > df[, x], 
     na.rm = TRUE)) 

# Limit1 Limit2 
# 1  0  0 
# 2  2  2 
# 3  1  0 
# 4  3  1 
# 5  1  0 
# 6  3  0 
# 7  1  2 
# 8  3  4 
# 9  0  0 
# 10  6  6 

와 비교해야 Limit 열의 양을 실행 data.table을 사용하면

library(data.table) 
setDT(df)[, c("Count1", "Count2") := 
      lapply(grep("Limit", names(df), value = TRUE), 
        function(x) rowSums(.SD[, 
        grepl("^NT", names(df)), with = FALSE] > 
        .SD[[x]], na.rm = TRUE)) 
      ] 
을 사용하여 참조로 열을 업데이트 할 수 있습니다.
관련 문제