r - 过滤后我的所有值都变为na

时间:2017-03-26 15:35:54

标签: r filter

请帮帮我! 我有一个包含银行账户的大数据集

enter image description here

它按以下方式组织:

  

V1 - 注册银行号码

     

V2 - 帐户价值记录日期

     

V3 - 帐号

     

所有剩余的V - s都是值本身(以cur,金属等为单位)

我需要通过帐号进行过滤,保留表中的所有内容,但是需要特定的帐号。这是我使用的代码:

filelist = list.files(pattern = ".txt")

datalist = lapply(filelist, function(x)read.table(x, header=FALSE, sep = ";")) 

all_data = do.call("rbind", datalist) 

r_d <- rename(all_data, c("V1"="Number", "V2"="Dates", "V3"="Account"))
r_d$Account <- as.character(r_d$Account)
f_d <- filter(all_data, r_d$Account >= 42301 & r_d$Account <= 42315 |
    r_d$Account >= 20202 & r_d$Account <= 20210 |
    r_d$Account == 98010 | r_d$Account == 98015)

问题是这段代码的输出是一个只包含NA的表,一切都变成NA,即使这些acc数存在,我也绝对相信。

如果我在过滤器中使用Account而不是r_d$Account,则R会写入该对象帐户不存在。我也不明白。

拜托,纠正我。

1 个答案:

答案 0 :(得分:0)

您的代码有几个问题。获得NA的原因是您将NULL传递到所有地方。你看过r_d$Account了吗?当您在代码中发现问题时,您应该首先逐步进行分餐,在这种情况下,您会看到r_d$Account为您提供NULL。为什么?因为您没有正确重命名列。 colnames(r_d)将会显露出来。

首先,rename使用未引用的参数进行非标准评估,或rename_采用character = character的向量对。这些可能有效(我无法确定,因为我不打算转录您的数据图像...请在下次提供来自dput的可复制输出!):

# non-standard evaluation
rename(all_data, Number=V1, Dates=V2, Account=V3)

# standard-evaluation #1:
rename_(all_data, Number="V1", Dates="V2", Account="V3")

# standard-evaluation #2
rename_(all_data, .dots = c("Number"="v1", "Dates"="V2", "Account"="V3"))

从那里,如果您单步执行代码,您会发现r_d$Account不再是NULL

其次,您是否有理由创建r_d但仍然引用all-data?肯定有时候你需要做这种事情;这里不是其中之一,它太容易出问题(例如,如果其中一个的行顺序或维度发生变化)。

第三,因为您将$Account转换为character,所以使用不等式比较是非常不合适的。虽然这样做肯定是合法的("1" < "2"TRUE),但它会遇到问题,例如"11" < "2"也是TRUE,而"3" < "22"FALSE。我不是说你应该避免转换为字符串;我认为这是合适的。您对帐户范围的使用令人困惑:帐号应该是分类的,而不是序数,因此选择帐号的范围是不合逻辑的。

第四,即使假设帐号是序数且范围有意义,也可以改进filter的使用,但前提是你要么(a)接受字符串化的比较-numbers是可接受的("3" > "22"),或(b)将它们保持为整数。首先,您不应该在NSE dplyr函数中引用r_d$。 (修改:您还需要使用括号对逻辑进行分组。)这是您代码中的字面翻译:

f_d <- filter(r_d, (Account >= 42301 & Account <= 42315) |
    (Account >= 20202 & Account <= 20210) |
    Account == 98010 | Account == 98015)

您可以通过以下方式使其更具可读性:

f_d <- filter(r_d,
              Account %in% c(98010, 98015) |
                between(Account, 42301, 42315) |
                between(Account, 20202, 20210)
              )

假设$Accountcharacter,或许更好的方法是根据其他一些标准(开放日期,订单日期,其他来自不同列的内容)来确定哪些帐户是合适的),一旦你有一个帐号矢量,做

filter(r_d,
       Account %in% vector_of_interesting_account_numbers)