我有一个包含多列的数据框,需要我清理。所有列都需要使用相同的逻辑进行清理。我可以为我提供尽可能多的变量
dsr$DSR23 <- ifelse(dsr$DSR23 == 'Refused', NA, dsr$DSR23)
dsr$DSR24 <- ifelse(dsr$DSR24 == 'Refused', NA, dsr$DSR24)
dsr$DSR25 <- ifelse(dsr$DSR25 == 'Refused', NA, dsr$DSR25)
但如果可能的话,我想在一个for循环中完成它。
有人可以提出代码来执行此操作而无需复制和粘贴相同的ifelse语句一百万次吗?
答案 0 :(得分:1)
这可能是令人困惑的脚本,但您可以考虑使用within
函数执行数据帧本地的for
循环,然后将结果存储回dataframe对象。这是一个例子:
set.seed(1)
d <- data.frame(a=1:10, b=11:20, c=sample(0:1,10,TRUE))
d
# a b c
#1 1 11 0
#2 2 12 0
#3 3 13 1
#4 4 14 1
#5 5 15 0
#6 6 16 1
#7 7 17 1
#8 8 18 1
#9 9 19 1
#10 10 20 0
d <- within(d, {
for(i in 1:2) # column numbers you want to recode
assign(names(d)[i], ifelse(c==1, NA, d[,i]))
rm(i)
})
d
# a b c
#1 1 11 0
#2 2 12 0
#3 NA NA 1
#4 NA NA 1
#5 5 15 0
#6 NA NA 1
#7 NA NA 1
#8 NA NA 1
#9 NA NA 1
#10 10 20 0
基本上,这会对每个变量执行ifelse
函数,将这些函数存储回within
函数中的数据框中,然后您只需将结果存储回原始数据框中。
注意:我知道有很多方法可以做到这一点,所以我只是扔了一个。毫无疑问,有人会批评在这里使用assign
,这是一个非常有效的批评。
答案 1 :(得分:0)
for循环非常慢。您可以尝试对数据帧进行子集化。如果您的示例基于以下情况工作:如果广告位等于“拒绝”#39;然后将条目更改为NA,然后:
dsr$DSR23[dsr$DSR23 == 'Refused'] <- NA
答案 2 :(得分:0)
我之前使用过这样的代码进行清洁:
vars<-c("DSR23", "DSR24", "DSR25")
dsr[,vars] = lapply(vars, function(x) ifelse(dsr[,x]=="Refused", NA, dsr[,x]))
在R中使用for over循环通常是首选