2016-10-09 5 views
0

데이터 프레임에서 열 상을 분할하려하지만 분할 결과가 다른 열을 반환하는 경우 열을 원래 데이터 프레임에 다시 바인딩하는 방법 :R의 길이가 다른 데이터 프레임의 열을 분할합니다.

SAMPLE DF :

 Name Value  Awards 
1  A1  NA  3 wins. 
2  A2  1000 NA 
3  A3  NA  2 wins. 
4  A4  1999 1 win 
5  A5  8178569 5 wins & 4 nominations. 

예상 결과 : 그러니까 기본적으로 내가 승 지명 전에 수상 및 모든 수를 분할해야 내가 기능을 추가 할 필요가

 Name Value  Awards     AwardsNum Cat 
1  A1  NA  3 wins.     3   A 
2  A2  1000 NA      NA   NA 
3  A3  NA  2 wins.     2   A 
4  A4  1999 1 win     1   A 
5  A5  8178569 5 wins & 4 nominations. 9   C 

즉, 이들을 합산 한 다음 함수의 결과와 값

I는 다음과 같은 한 범위에 기초하여 분류 (CAT)을 제공

strsplit(DF$Awards," ") 
    cbind(DF,strsplit(DF$Awards," ") 

Error in data.frame(c("3", "wins."), "N/A", c("2", "wins."), c("1", "win." : 
arguments imply differing number of rows: 2, 1, 5 

UPDATE : CATEGORIES < --- NA를 들어 더 상없고 후보 - 다른 C

I need to play around between B and C since I need to make sure that they are not more than 5:1 ratio between B and C 
+0

다른 카테고리를 결정하는 요소는 무엇입니까? 예를 들어 한 행이 카테고리 "A"대 카테고리 "C"가되어야한다는 것을 어떻게 알 수 있습니까? – jdobres

답변

0

솔루션 가열 공기 조절기를 사용하는 것입니다 - <가 < --- 사이 1 종류 5 B 모든 숫자와 일치하는 lar 표현식. 그런 다음 이들을 합하여 카테고리를 할당 할 수 있습니다.

library(stringr) 

df_new <- sapply(DF$Awards, function(x){ 
    # get all numbers 
    nums <- unlist(str_match_all(x, "[0-9]+")) 
    # calculate sum 
    AwardsNum <- sum(as.numeric(nums)) 
    # assign category basing on sum 
    if (is.na(AwardsNum)){ 
     Cat <- NA 
    }else if(AwardsNum == 0){ 
     Cat <- "A" 
    }else if(AwardsNum < 5){ 
     Cat <- "B" 
    }else{ 
     Cat <- "C" 
    } 
    return(c(AwardsNum, Cat)) 
}) 

# create new rows in df 
DF$AwardsNum <- as.numeric(df_new[1, ]) 
DF$Cat <- df_new[2, ] 
0

@Istrel이 이미이 질문에 대한 답변을 게시 한 것을 알았습니다. 어쨌든 약간 차이가 있기 때문에 광산을 게시 할 것입니다.

df <- data.frame(
    Name = c("A1", "A2", "A3", "A4", "A5"), 
    Value = c(NA, 1000, NA, 1999, 8178569), 
    Awards = c("3 wins", NA, "2 wins", "1 win", "5 wins & 4 nomiations") 
) 

library(magrittr) 
n.awards <- sapply(df$Awards, function(x){ 
    ifelse(is.na(x), 0,{ 
     x %>% as.character %>% 
      strsplit("[^0-9]+") %>% 
      unlist %>% 
      as.numeric %>% 
      sum 
    }) 
}) 
brks <- c(-0.1,0.9,4.9, 100) 
cc <- cut(n.awards,brks) 
cat <- c("A", "B", "C") 
df.final <- cbind(df, AwardsNum = n.awards, Cat = cat[cc]) 

잘라 내기를 사용하면 여러 if 문을 사용하지 않고 벡터를 그룹화 할 수 있습니다.

+0

! parksw3과 @lstrel 모두 당신의 제안은 훌륭합니다 .. 그리고 빨리 알 고리 –

+0

@lstrel을 수행하는 것보다, 내가 발견하려고하는 유일한 방법은 그것을 다시 원래의 데이터 프레임으로 가져 오는 것입니다. 제가 할 수 있다고 생각했습니다. rbind하지만 확실하지 않은 방법을 내가 원래 행에 합류 확신 할 수 있습니다 –

관련 문제