2017-12-14 3 views
2

다음과 같이 데이터 프레임과 열 목록이 있습니다. 내 열 이름 목록에서 값 기반을 변경하려고합니다. 즉 내 df 그 열이 열 목록과에서 일치하는 값이> 한 다음 다른 일에 그 값을 같은 값이면열 이름 목록을 기반으로 데이터 프레임의 값을 변경하는 방법

grp = c("A","A","A","A","A","A","A") 
value_1 =c(10,21,33,31,423,132,245) 
value_2 = c(0,0,NA,1.5,1.75,1,NA) 
value_3 = c(10,30,NA,1.0,1.3,1.4,50) 
value_4 = c(0,0,NA,1.5,1.75,1,NA) 
value_5 = c(1,1.25,0,1.5,0,NA,0) 

df = data.frame(grp,value_1,value_2,value_3,value_4,value_5) 

lis = c('value_2','value_4','value_5') 

내가 다음 코드

df1 = df %>% 
      mutate(lis = ifelse(names(df) >1,1,names(df))) 

도움으로 애 쓰고 desired_df를 얻을 수 다음과 같이 출력을 얻으려면

grp_1 value_1 value_2 value_3 value_4 value_5 
A   10  0  10  0 1 
A   21  0  30  0 1 
A   33 NA  NA  NA 0 
A   31 1  1   1 1 
A  423 1  1   1 0 
A   132 1  1   1 NA 
A   245 NA  50  NA 0 

미리 감사드립니다.

+1

가 보이는 – akrun

+1

''df [lis] <- lapply (df [lis], function (x) replace (x, list = x> 1, 1)); df'. – A5C1D2H2I1M1N2O1R2T1

답변

0

우리는 ifelse하는 대신 그 열 mutate

library(dplyr) 
df %>% 
    mutate_at(lis, funs(ifelse(.> 1, 1, .))) 
1

을 관심의 기능을 적용 '목록'객체와 funs에 저장된 열 이름을 지정 mutate_at을 사용할 수 있습니다, 당신은 또한 고려할 수 있습니다 replace 기본적으로 vector[index] <- values입니다. 실제 응용 프로그램에서

, 당신은 할 수 : 같은 논리를 사용

df[lis] <- lapply(df[lis], function(x) replace(x, x > 1, 1)) 
# Or 
# df[lis] <- lapply(df[lis], function(x) { x[x > 1] <- 1; x}) 
df 
# grp value_1 value_2 value_3 value_4 value_5 
# 1 A  10  0 10.0  0  1 
# 2 A  21  0 30.0  0  1 
# 3 A  33  NA  NA  NA  0 
# 4 A  31  1  1.0  1  1 
# 5 A  423  1  1.3  1  0 
# 6 A  132  1  1.4  1  NA 
# 7 A  245  NA 50.0  NA  0 

, 당신은 data.table로 다음을 수행 할 수는 DF %>`필요 같은

library(data.table) 
setDT(df)[, (lis) := lapply(.SD, function(x) {x[x > 1] <- 1; x}), .SDcols = lis][] 
# grp value_1 value_2 value_3 value_4 value_5 
# 1: A  10  0 10.0  0  1 
# 2: A  21  0 30.0  0  1 
# 3: A  33  NA  NA  NA  0 
# 4: A  31  1  1.0  1  1 
# 5: A  423  1  1.3  1  0 
# 6: A  132  1  1.4  1  NA 
# 7: A  245  NA 50.0  NA  0 
관련 문제