Условно изменяющиеся переменные, которые соответствуют нескольким столбцам в R - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь очистить набор данных опроса, и у меня возникли проблемы с условиями.Спасибо всем, кто ответил на мой последний вопрос, но этот вопрос немного отличается и ставит меня в тупик.

У меня есть набор данных, подобный приведенному ниже.Я пытаюсь написать заявление так:

  • Если X, Y и Z все #NULL !, это меняет эти #NULL!записи в НС.Переменная a предназначена для представления более 90+ переменных, входящих в набор, с которыми я не хочу связываться.
  • Если в любом X, Y или Z есть числа, #NULL изменится на 0.

Вот примерный набор данных, который я построил и который показывает, что я имею в виду:

set.seed(2)
df <- data.frame(
  X = as.factor(sample(c("1.00", "#NULL!"), 10, replace = TRUE)),
  Y = as.factor(sample(c("2.00", "#NULL!"), 10, replace = TRUE)),
  Z = as.factor(sample(c("3.00", "#NULL!"), 10, replace = TRUE)),
  a = as.factor(sample(c("4.00", "#NULL!"), 10, replace = TRUE))
)
df

Вывод:

> df X Y Z a 1 1.00 2.00 #NULL! 4.00 2 1.00 2.00 3.00 #NULL! 3 #NULL! #NULL! #NULL! 4.00 4 #NULL! 2.00 3.00 4.00 5 1.00 #NULL! 3.00 #NULL! 6 #NULL! 2.00 3.00 #NULL! 7 #NULL! #NULL! 3.00 #NULL! 8 #NULL! #NULL! 3.00 4.00 9 #NULL! 2.00 #NULL! #NULL! 10 1.00 #NULL! 3.00 4.00

В этом случае все нулевые значения для X, Y и Z должны быть равны 0, кроме строки 3, где они должныбыть сделано NA.Колонка А должна оставаться нетронутой.У кого-нибудь есть идеи, как к этому подойти?Несколько запутанных операторов ifelse() не сработали, и я пытался изменить сценарий dplyr, который кто-то предложил для другой проблемы, но я также не могу заставить это работать.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Это окольный способ сделать это, но преобразование ваших коэффициентов в числовое сначала облегчает получение результата.

new.df<-df %>%
  mutate_if(is.factor, as.character) %>%               #convert columns to characters first
  mutate_if(is.character, as.numeric) %>%              #convert the characters to numeric
  mutate_if(is.numeric, replace_na, replace = 0) %>%   #replace all NAs with 0
  mutate(TEST = ifelse(X==0&Y==0&Z==0, NA, 0)) %>%     #create column to test for conditions
  mutate(X = ifelse(is.na(TEST), "#NULL!", X),
         Y = ifelse(is.na(TEST), "#NULL!", Y),
         Z = ifelse(is.na(TEST), "#NULL!", Z)) %>%     #replace NAs with initial NULL results
  select(-TEST)                                        #remove test column
0 голосов
/ 01 марта 2019

Поскольку столбцы factor, создайте level '0' и измените уровень "#NULL!"на «0» и замените строки, которые имеют все 0, на NA

df[] <- lapply(df, function(x) {levels(x) <- c(levels(x), "0")
           levels(x)[levels(x) == "#NULL!"] <- "0"
        x})

df[rowSums(df == '0') == ncol(df), ] <- NA

Предполагая, что OP хотел вернуть как numeric column

df[] <- lapply(df, function(x) 
      as.numeric(replace(as.character(x), x== "#NULL!", "0")))    
df[rowSums(df == 0) == ncol(df), ] <- NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...