R中的数据清理循环

时间:2014-04-09 19:54:18

标签: r loops if-statement dataframe

我有一个包含多列的数据框,需要我清理。所有列都需要使用相同的逻辑进行清理。我可以为我提供尽可能多的变量

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语句一百万次吗?

3 个答案:

答案 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)

R中的

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循环通常是首选