2016-07-04 3 views
0

Я пытаюсь создать новый столбец со следующей логикой: для каждой строки, если имя строки является 's', новый столбец принимает значение суммы non пустые столбцы (в подмножестве), если сумма не равна нулю, и в этом случае она должна принимать значение столбца v1.R - Создать столбец из условной операции над несколькими несколькими столбцами

Пример data.frame

name year v1   COL1 COL2 COL3 COL4 COL5 COL6 COL7 
1 S 1960 0.00 0.000000000 NA NA NA NA NA NA ... 
2 S 1961 0.00 0.000000000 NA NA NA NA NA NA ... 
3 S 1962 0.00 0.000000000 NA NA NA NA NA NA ... 
4 S 1963 0.00 0.000000000 NA NA NA NA NA NA ... 
5 N 1964 0.00 0.000000000 NA NA 55 NA 22 NA ... 
6 S 1965 -0.13 -0.160505952 NA NA NA NA NA 45 ... 

Т.Д. Пример кода, который я пытался:

df$nexcol <- 0 
df$nexcol[df["name"]=="S"] <-ifelse(rowSums(!is.na(df[df["name"]=="S",5:106]))==0, 
          df[df["name"]=="S","V1"],rowSums(!is.na(df[df["name"]=="S",5:106]))) 
df$nexcol[df["name"]=="N"] <- 1 

Ожидаемый результат

name year v1   COL1 COL2 COL3 COL4 COL5 COL6 COL7 ... nexcol 
1 S 1960 2.00 0.000000000 NA NA NA NA NA NA ... 2.00 
2 S 1961 3.00 0.000000000 NA NA NA NA NA NA ... 3.00 
3 S 1962 4.00 0.000000000 52 NA NA NA 10 NA ... 2 
4 S 1963 2.00 0.000000000 NA NA NA NA NA NA ... 2.00 
5 N 1964 3.00 0.000000000 NA NA 55 NA 22 NA ... 1 
6 S 1965 -0.13 -0.160505952 NA NA NA NA NA 45 ... 1 

ответ

1

Попробуйте что-то вроде этого, близко к тому, что вы пытались, но более R образом:

df$nexcol = rowSums(!is.na(df[5:10])) 
df$nexcol = with(df, ifelse(name == 'N', 1, ifelse(nexcol == 0, v1, nexcol))) 

df 
# name year v1  COL1 COL2 COL3 COL4 COL5 COL6 COL7 nexcol 
# 1 S 1960 2.00 0.000000 NA NA NA NA NA NA  2 
# 2 S 1961 3.00 0.000000 NA NA NA NA NA NA  3 
# 3 S 1962 4.00 0.000000 52 NA NA NA 10 NA  2 
# 4 S 1963 2.00 0.000000 NA NA NA NA NA NA  2 
# 5 N 1964 3.00 0.000000 NA NA 55 NA 22 NA  1 
# 6 S 1965 -0.13 -0.160506 NA NA NA NA NA 45  1 

Или использовать dplyr упаковка:

library(dplyr) 
df %>% mutate(nexcol = rowSums(!is.na(.[5:10])), 
       nexcol = case_when(.$name == 'N' ~ 1, .$nexcol == 0 ~ .$v1, TRUE ~ .$nexcol)) 

# name year v1  COL1 COL2 COL3 COL4 COL5 COL6 COL7 nexcol 
# 1 S 1960 2.00 0.000000 NA NA NA NA NA NA  2 
# 2 S 1961 3.00 0.000000 NA NA NA NA NA NA  3 
# 3 S 1962 4.00 0.000000 52 NA NA NA 10 NA  2 
# 4 S 1963 2.00 0.000000 NA NA NA NA NA NA  2 
# 5 N 1964 3.00 0.000000 NA NA 55 NA 22 NA  1 
# 6 S 1965 -0.13 -0.160506 NA NA NA NA NA 45  1 
+0

спасибо, что это сработало! И это заставляет меня видеть другую проблему. Столбец V1 был «фактором» в моем коде, поэтому, когда он возвращается во втором ifelse, возвращаемое значение было индексом фактора (и в конкретном случае, который я анализирую, это 1) – nanicpc

Смежные вопросы