请帮帮我! 我有一个包含银行账户的大数据集
它按以下方式组织:
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会写入该对象帐户不存在。我也不明白。
拜托,纠正我。
答案 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)
)
假设$Account
为character
,或许更好的方法是根据其他一些标准(开放日期,订单日期,其他来自不同列的内容)来确定哪些帐户是合适的),一旦你有一个帐号矢量,做
filter(r_d,
Account %in% vector_of_interesting_account_numbers)