我正在尝试清理调查数据集,但在条件查询方面遇到了麻烦。感谢所有回答我最后一个问题的人,但是这个问题略有不同,也让我感到困扰。
我有一个像下面这样的数据集。我试图写这样的声明:
这是我构建的示例数据集,显示了我的意思:
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
脚本,但我也无法使它起作用。
谢谢!
答案 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