有条件地更改与R中的多个列匹配的变量

时间:2019-03-01 15:20:32

标签: r

我正在尝试清理调查数据集,但在条件查询方面遇到了麻烦。感谢所有回答我最后一个问题的人,但是这个问题略有不同,也让我感到困扰。

我有一个像下面这样的数据集。我试图写这样的声明:

  • 如果X,Y和Z均为#NULL !,它将更改这些#NULL!。 NA的条目。变量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行除外),第3行应设为NA。 a列应保持不变。有人知道如何解决这个问题吗?几个复杂的ifelse()语句不起作用,我一直在尝试修改有人提出的另一个问题的dplyr脚本,但我也无法使它起作用。

谢谢!

2 个答案:

答案 0 :(得分:1)

由于列为factor,因此创建一个level'0'并更改级别“ #NULL!”。设为“ 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

df[] <- lapply(df, function(x) 
      as.numeric(replace(as.character(x), x== "#NULL!", "0")))    
df[rowSums(df == 0) == ncol(df), ] <- NA

答案 1 :(得分:1)

这是一种绕行的方法,但是首先将因子转换为数字可以更轻松地获得结果。

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