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

有条件地更改与R中的多个列匹配的变量,r,R,我正在尝试清理调查数据集,但在条件方面遇到问题。感谢所有回答我最后一个问题的人,但这个问题有点不同,也让我感到困惑 我有一个类似下面的数据集。我试图写一份声明,以便: 如果X、Y和Z都为空!,它改变了那些#空!NA的条目。变量a代表集合中90多个我不想弄乱的其他变量 如果任何X、Y或Z中有数字,则#NULL将更改为0 下面是我构建的示例数据集,它显示了我的意思: set.seed(2) df <- data.frame( X = as.factor(sample(c("1.00",

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

我有一个类似下面的数据集。我试图写一份声明,以便:

  • 如果X、Y和Z都为空!,它改变了那些#空!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
set.seed(2)
df-df
X Y Z a
1 1.00 2.00#空!4
2 1.00 2.00 3.00#无效!
3#零#空#无效的4
4#空!2.00   3.00   4.00
5 1.00#零!3.00#零!
6#零!2.00 3.00#空!
7#零#无效的3.00#零!
8#零#无效的3.00   4.00
9#零!2.00#零#无效的
10 1.00#零!3.00 4.00

在这种情况下,X、Y和Z的所有空值都应设为0,第3行除外,第3行应设为NA。a列应保持不变。有人知道怎么做吗?几个复杂的
ifelse()
语句都不起作用,我一直在尝试修改别人为另一个问题建议的
dplyr
脚本,但我也无法让它起作用


谢谢大家!

由于列是
因子
,请创建
级别
“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

这是一种迂回的方法,但首先将因子转换为数字会更容易得到结果

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
new.df%
如果(is.factor,as.character)%>%,则进行变异#首先将列转换为字符
如果(is.character,as.numeric)%>%,则进行变异#将字符转换为数字
如果(is.numeric,replace_na,replace=0)%>%,则对所有NAs进行变异#将所有NAs替换为0
mutate(TEST=ifelse(X==0&Y==0&Z==0,NA,0))%>%#创建列以测试条件
变异(X=ifelse(is.na(TEST),“#NULL!”,X),
Y=ifelse(is.na(TEST),“#NULL!”,Y),
Z=ifelse(is.na(TEST),“#NULL!”,Z))%>%#用初始空结果替换NAs
选择(-TEST)#删除测试列

您想作为
因子
列或
数值
返回第3行的逻辑是什么?对于所有为空的任何行,将值替换为
NA
?很抱歉响应太晚-我需要将这些值作为因子返回,是的,所有为空->NA。XYZ都是种族变量,所以可能有一个或多个,但单个NA应该是0,因为它们回答了问题,而不是X。如果它们都为空,就好像它们没有回答问题。我对如何阅读这个有点困惑,因为我不熟悉
lappy
函数(查看它!)-这里的“x”应该是我的变量“x”、“Y”和“Z”吗?因为如果是这样的话,我会收到一条错误消息,上面写着
error in
[@anongard我用的是你的例子,但没有得到一个错误啊!我不知道我以前做错了什么,但我再试了一次,结果成功了。非常感谢!事实上,第一部分成功了。这是第二部分,df[rowSums]位,这就抛出了那个错误。我应该说我的数据集中有3个以上的列-这可能是问题吗?我正在研究语法,看看是否可以指定==0将导致NA的行。你知道一个解决方案吗?@anongard你的数据集中有所有列作为
factor
?对于
df==“0”
rowsumes(df==“0”)您得到的输出是什么
如果原始数据集与示例中的
n
列相似,那么它应该可以工作。最好显示与原始数据相似的示例数据,以便我们知道结构是如何工作的!我不知道我之前是如何错过了此响应的。谢谢!嗯。实际上,这其中的某些内容正在改变其余部分中的所有#NULL将我的数据集设置为0,这是我不想要的。我将继续使用此。。。
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