【问题标题】:r - after filtering all my values become nar - 过滤后我的所有值变成 na
【发布时间】:2017-08-19 05:40:53
【问题描述】:

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

它的组织方式如下:

V1 - 银行的注册号

V2 - 账户价值记录日期

V3 - 帐号

所有剩余的V-s 用于值本身(在 cur、metals 等中)

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

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)

问题是这段代码的输出是一个只包含NAs 的表,所有内容都变成了NA,即使这些acc 数字存在,我对此非常确定。

如果我在过滤器中使用 Account 而不是 r_d$Account,R 会告诉我对象 Account 不存在。我也不明白。

请纠正我。

【问题讨论】:

  • 如果您使用的过滤器功能来自包dplyr,请尝试删除“r_d$”并只写不带引号的帐户,如下所示:filter(all_data, Account &gt;= 42301 ...
  • 在这种情况下,虽然@PLapointe 的建议是有效的,但代码的工作原理是一样的;当您的中间管道功能更改 data.frame 时,它​​不会起作用。但是,由于这不是reproducible question,我们无能为力。问题:(1)数据副dput(head(data,n=10))的图片; (2)rename的使用不正确; (3) 不建议使用filter; (4) 你显示filelist 但它在这里是否相关?
  • 顺便说一句:基于您将帐号视为序数副分类,您的某些过滤将受益于 %in% 和 dplyr::between 函数,可以说使您的过滤器更易于阅读。跨度>
  • 如果我在过滤器中使用 Account 而不是 r_d$Account,R 会告诉我对象 Account 不存在。我也不明白。
  • 为什么重命名功能不正确?然后我猜问题从这里开始,R 不明白要过滤什么,这就是为什么只给我 NA-s,对吗?

标签: r filter


【解决方案1】:

您的代码有几个问题。你得到NAs 的原因是你到处都在传递NULLs。你看过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" &lt; "2" 是TRUE),但它会遇到问题,例如"11" &lt; "2" 也是TRUE,而"3" &lt; "22" 是FALSE。我并不是说您应该避免转换为字符串;我认为是合适的。您对帐号范围的使用令人困惑:帐号应该是分类的,而不是顺序的,因此选择帐号的范围是不合逻辑的。

第四,即使假设帐号应该是序数并且范围是有意义的,您对filter 的使用可以得到改进,但前提是您 (a) 接受字符串化数字的比较是可以接受的 ("3" &gt; "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)
              )

也许更好的方法是,假设$Account 是character,将根据其他一些标准(开放日期、订单日期、其他列中的其他内容)确定哪些帐户是合适的,然后一次你有一个帐号向量,做

filter(r_d,
       Account %in% vector_of_interesting_account_numbers)

【讨论】:

  • 从您的回答中获得了很多有用的新信息!出现了另一个问题:(R 只显示帐号 98010 和 98015,但它会跳过 42301、42315 和 20202 和 20210 之间的所有信息:(你不知道为什么吗?
  • 有进展吗,Chingiz?如果解决了,请“接受”答案;如果没有,也许我们可以提供帮助。 (接受答案不仅会给回答者加分,还可以关闭其他有类似问题的人,以表明此答案有效。仅评论不一定足够。谢谢!)
  • 哦,对不起,我没有看到你的评论!我会很高兴地做到这一点!这个接受按钮在哪里?)
  • 答案的左上角,紧挨着“上/下投票”箭头的下方。 (只有提出问题的用户才能看到。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 2017-01-23
  • 2023-03-13
  • 2021-11-29
  • 2014-12-09
  • 2019-06-06
相关资源
最近更新 更多