2017-04-20 2 views
0

(나는 대답을 얻은 후에 정말로 멍청한 느낌이 들지만 나는 이것을 알 수 없다.)R에서 data.frame의 특정 하위 집합에 대한 연산을 수행하는 방법은 무엇입니까?

끝에 빈 열이있는 data.frame이 있습니다. 대부분 NAs로 채워지 겠지만 값의 일부 행에 값을 채워야합니다. 이 열은 data.frame의 열 중 하나에서 누락 된 데이터를 추측합니다. 행의 두 MaxPlayers은 "N/A"를 가지고

Game | Rating | MinPlayers | MaxPlayers | MaxPlayersGuess 
--------------------------------------------------------- 
A | 6  | 3   | 6   | 
B | 7  | 3   | 7   | 
C | 6.5 | 3   | N/A  |median(df$MaxPlayers[df$MinPlayers ==3,]) 
D | 7  | 3   | 6   | 
E | 7  | 3   | 5   | 
F | 9.5 | 2   | 5   | 
G | 6  | 2   | 4   | 
H | 7  | 2   | 4   | 
I | 6.5 | 2   | N/A  |median(df$MaxPlayers[df$MinPlayers ==2,]) 
J | 7  | 2   | 2   | 
K | 7  | 2   | 4   | 

주의 사항 :

내 초기 data.frame는 다음과 같이 보인다. 내가하려고하는 것은 내가 MaxPlayers가 무엇인지 추측하기 위해 필요한 정보를 사용하는 것이다. 3 인 게임의 중앙값 (MaxPlayers)이 6 인 경우 MinPlayers == 3 및 MaxPlayers == N/A 인 게임의 경우 MaxPlayerGuess가 6이어야합니다. (필자는 위의 예에서 얻을해야하는지 값 MaxPlayerGuess 코드에 표시하려고했습니다.)

결과 data.frame는 다음과 같이 보일 것이다 :

Game | Rating | MinPlayers | MaxPlayers | MaxPlayersGuess 
--------------------------------------------------------- 
A | 6  | 3   | 6   | 
B | 7  | 3   | 7   | 
C | 6.5 | 3   | N/A  |6 
D | 7  | 3   | 6   | 
E | 7  | 3   | 5   | 
F | 9.5 | 2   | 5   | 
G | 6  | 2   | 4   | 
H | 7  | 2   | 4   | 
I | 6.5 | 2   | N/A  |4 
J | 7  | 2   | 2   | 
K | 7  | 2   | 4   | 

한 시도의 결과를 공유하기 :

gld$MaxPlayersGuess <- ifelse(is.na(gld$MaxPlayers), median(gld$MaxPlayers[gld$MinPlayers,]), NA) 


Error in gld$MaxPlayers[gld$MinPlayers, ] : 
incorrect number of dimensions 

답변

2

게시 된 예제를 기준으로 업데이트 중입니다.

오늘의 팁입니다. 때로는 원하는 것을 계산 한 다음 이러한 모든 논리적 연속성을 사용하지 않고 필요할 때마다 잡아내는 것이 더 쉽습니다. 당신은 한꺼번에 모든 것을 계산할 수있는 방법을 찾아 내려고 노력하고 있으며, 혼란스럽고 단계적으로 깰 수 있습니다. "MinPlayer"의 각 가능한 그룹에 대해 "MaxPlayer"의 중간 값을 알아야합니다. 그런 다음 MaxPlayer가없는 경우 해당 값을 사용하려고합니다. 여기 간단한 방법이 있습니다.

#generate fake data 
MinPlayer <- rep(3:2, each = 4) 
MaxPlayer <- rep(2:5, each = 2, times = 2) 

df <- data.frame(MinPlayer, MaxPlayer) 

#replace some values of MaxPlayer with NA 
df$MaxPlayer <- ifelse(df$MaxPlayer == 3, NA, df$MaxPlayer) 

####STARTING DATA 
# > df 
# MinPlayer MaxPlayer 
# 1   3   2 
# 2   3   2 
# 3   3  NA 
# 4   3  NA 
# 5   2   4 
# 6   2   4 
# 7   2   5 
# 8   2   5 
# 9   3   2 
# 10   3   2 
# 11   3  NA 
# 12   3  NA 
# 13   2   4 
# 14   2   4 
# 15   2   5 
# 16   2   5 

####STEP 1 
#find the median of MaxPlayer for each group of MinPlayer (e.g., when MinPlayer == 1, 2 or whatever) 
#just add a column to the data frame that has the right median value for each subset of MinPlayer in it and grab that value to use later. 
library(plyr) #plyr is a great way to compute things across data subsets 
df <- ddply(df, c("MinPlayer"), transform, 
      median.minp = median(MaxPlayer, na.rm = TRUE)) #ignore NAs in the median 

####STEP 2 
#anytime that MaxPlayer == NA, grab the median value to replace the NA, otherwise keep the MaxPlayer value 
df$MaxPlayer <- ifelse(is.na(df$MaxPlayer), df$median.minp, df$MaxPlayer) 

####STEP 3 
#you had to compute an extra column you don't really want, so drop it now that you're done with it 
df <- df[ , !(names(df) %in% "median.minp")] 

####RESULT 
# > df 
# MinPlayer MaxPlayer 
# 1   2   4 
# 2   2   4 
# 3   2   5 
# 4   2   5 
# 5   2   4 
# 6   2   4 
# 7   2   5 
# 8   2   5 
# 9   3   2 
# 10   3   2 
# 11   3   2 
# 12   3   2 
# 13   3   2 
# 14   3   2 
# 15   3   2 
# 16   3   2 

여기 아래 올드 대답 ....

재현 예를 게시하시기 바랍니다! 당신은 단지 기본 색인에 대해 묻는 경우

#fake data 
this <- rep(1:2, each = 1, times = 2) 
that <- rep(3:2, each = 1, times = 2) 

df <- data.frame(this, that) 

.... 예는, 뭔가 조건을 충족하는 값을 찾을 수 있습니다, 이것은 (?하는 조회) 조건에 일치하는 값의 행 인덱스를 반환합니다

> which(df$this < df$that) 
[1] 1 3 

이것은 행 인덱스가 아닌 조건에 맞는 값을 반환합니다. "which"가 반환 한 행 인덱스를 사용하여 데이터 프레임의 올바른 열에서 해당 값을 찾습니다 (여기 "this").

> df[which(df$this < df$that), "this"] 
[1] 1 1 

"this"가 "less"일 때 계산을 적용하고 데이터 프레임에 새 열을 추가하려면 "ifelse"를 사용하십시오. else가 물건이 사용자의 조건과 일치하는 논리 벡터를 작성한 다음 조건에 맞는 항목 (예 : 논리적 테스트 == TRUE)에 물건을 넣습니다.

#if "this" is < "that", multiply by 2 
df$result <- ifelse(df$this < df$that, df$this * 2, NA) 

> df 
this that result 
1 1 3  2 
2 2 2  NA 
3 1 3  2 
4 2 2  NA 

재현 가능한 예가 없으면 더 이상 제공 할 수 없습니다.

+0

사과, 나는 심지어 내가 재현 예제를 제공하는 방법을 모르는 절차를 코딩을 시작하는 방법을 모르기 때문에. – Zelbinian

+0

답변을 시도해 주셔서 감사합니다. 몇 가지 제안 사항을 시험해 봄으로써 문제를 더 잘 파악하고 사례를 게시하는 방법을 파악할 수있었습니다. – Zelbinian

+0

@ Zelbinian, 그래서 일반적으로 griffmer 's를 답변으로 표시합니다. – Chris

0

나는 당신이 @ griffmer의 대답에 필요한 모든 것을 이미 가지고 있다고 생각한다.그러나 덜 우아하지만 어쩌면 더 직관적 인 방법은 루프 수 :

## Your data: 
df <- data.frame(
     Game = LETTERS[1:11], 
     Rating = c(6,7,6.5,7,7,9.5,6,7,6.5,7,7), 
     MinPlayers = c(rep(3,5), rep(2,6)), 
     MaxPlayers = c(6,7,NA,6,5,5,4,4,NA,2,4)  
) 

## Loop over rows: 
df$MaxPlayersGuess <- vapply(1:nrow(df), function(ii){ 
      if (is.na(df$MaxPlayers[ii])){ 
       median(df$MaxPlayers[df$MinPlayers == df$MinPlayers[ii]], 
         na.rm = TRUE)    
      } else { 
       df$MaxPlayers[ii] 
      }   
     }, numeric(1)) 

당신이 dplyr를 사용하려면 당신에게

df 
# Game Rating MinPlayers MaxPlayers MaxPlayersGuess 
# 1  A 6.0   3   6    6 
# 2  B 7.0   3   7    7 
# 3  C 6.5   3   NA    6 
# 4  D 7.0   3   6    6 
# 5  E 7.0   3   5    5 
# 6  F 9.5   2   5    5 
# 7  G 6.0   2   4    4 
# 8  H 7.0   2   4    4 
# 9  I 6.5   2   NA    4 
# 10 J 7.0   2   2    2 
# 11 K 7.0   2   4    4 
0

을 제공합니다, 당신은 시도 할 수 있습니다 :

입력 :

df <- data.frame(
    Game = LETTERS[1:11], 
    Rating = c(6,7,6.5,7,7,9.5,6,7,6.5,7,7), 
    MinPlayers = c(rep(3,5), rep(2,6)), 
    MaxPlayers = c(6,7,NA,6,5,5,4,4,NA,2,4)  
) 

프로세스 :

df %>% 
    group_by(MinPlayers) %>% 
    mutate(MaxPlayers = if_else(is.na(MaxPlayers), median(MaxPlayers, na.rm=TRUE), MaxPlayers)) 

이 그룹은 데이터 기반 MinPlayers을 그룹화 한 다음 누락 된 데이터가있는 행에 MaxPlayers의 중간 값을 할당합니다.

출력 :

Source: local data frame [11 x 4] 
Groups: MinPlayers [2] 

    Game Rating MinPlayers MaxPlayers 
    <fctr> <dbl>  <dbl>  <dbl> 
1  A 6.0   3   6 
2  B 7.0   3   7 
3  C 6.5   3   6 
4  D 7.0   3   6 
5  E 7.0   3   5 
6  F 9.5   2   5 
7  G 6.0   2   4 
8  H 7.0   2   4 
9  I 6.5   2   4 
10  J 7.0   2   2 
11  K 7.0   2   4 
관련 문제