2016-11-29 1 views
0

이 질문은 이전 검색어 (내 검색 기준)와 비슷하지만 비틀어졌습니다. 효율성을 위해이 작업을 수행하는 데 [s, l, v] 적용을 사용하겠습니다. 출력을 생산, 나는 각 var에 # 버전 1 (V1) 및 버전 2 (V2)의 정보를 amalgamates 새로운 기능을 만들R - 여러 개의 유사한 변수에 대한 이전 열을 기반으로 한 새로운 열

id var1_dose_v1 var1_dose_v2 var2_dose_v1 var2_dose_v2 var3_dose_v1 var3_dose_v2 
1   2   NA   NA   1   NA   1 
2   4   NA   4   NA   NA   4 
3   NA   4   2   NA   2   NA 
1   1   NA   3   NA   3   NA 
2   NA   3   5   NA   5   NA 

아래 다음과 같습니다

df <- data.frame(id = c(1,2,3,1,2), var1_dose_v1 = c(2,4,NA,1,NA), 
      var1_dose_v2 = c(NA,NA,4,NA,3), 
      var2_dose_v1 = c(NA,4,2,3,5), 
      var2_dose_v2 = c(1,NA,NA,NA,NA), 
      var3_dose_v1 = c(NA,NA,2,3,5), 
      var3_dose_v2 = c(1,4,NA,NA,NA))) 

이하.

id var1_dose var2_dose var3_dose 
1   2   1   1 
2   4   4   4 
3   4   2   2 
4   1   3   3 
5   3   5   5 

수천 개의 var가 있기 때문에 apply를 사용하는 것이 중요합니다.

도움 주셔서 감사합니다.

+0

질문에 대한 답변은 무엇입니까? 다음의 힌트 : http://stackoverflow.com/help/someone-answers –

답변

0

This-

df[is.na(df)] <- 0 
new_df <- sapply(seq(1:((ncol(df)-1)/2)), function(x) 
      { 
      df[, paste0("var",x,"_dose_v1")] + df[, paste0("var",x,"_dose_v2")] 
      }) 
+0

일부 변수에는 3 회 복용하고 나머지는 2 회 복용하면 어떻습니까? –

+0

간단히하기 위해 솔루션은 일반화되지 않고 질문에 게시 된 요구 사항으로 제한됩니다. 맞습니다. 복용량에 따라 다른 버전이있는 경우에는 작동하지 않습니다. –

0
func <- function(i){ 
    col <- paste0("var",i,"_dose") 
    xx <- colnames(df)[grep(col, colnames(df))] 
    yy <- rowSums(df[xx], na.rm = TRUE) 
} 
l = lapply(1:((dim(df)[2]-1)/2) , func) 

df1 = as.data.frame(l) 
colnames(df1) <- paste0("var",1:((dim(df)[2]-1)/2),"_dose") 

# > df1 
# var1_dose var2_dose var3_dose 
# 1   2   1   1 
# 2   4   4   4 
# 3   4   2   2 
# 4   1   3   3 
# 5   3   5   5 

2 버전은 항상 나란히 될 것하는 경우 : 다음 내 코드의 concised 버전

l = lapply(1:((dim(df)[2]-1)/2), 
    function(i) rowSums(df[colnames(df)[c(i*2,i*2+1)]], na.rm = T)) 
df1 = as.data.frame(l) 
colnames(df1) <- paste0("var",1:((dim(df)[2]-1)/2),"_dose") 
0

이를 가질 수 모든 변수 또는 용량에 대해 일반적인 솔루션 인 dplyr에는 '합체'라는 새로운 기능이 내장되어 있습니다.

library(dplyr) 
grps <- unique(sub("_v.*$?", "", names(df)[-1])) 
mat <- sapply(grps, function(g) { 
    do.call("coalesce", unname(as.list(df[grep(g, names(df))]))) 
}) 
df2 <- data.frame(id=df$id, mat) 
# id var1_dose var2_dose var3_dose 
# 1 1   2   1   1 
# 2 2   4   4   4 
# 3 3   4   2   2 
# 4 1   1   3   3 
# 5 2   3   5   5 
관련 문제