我有一个180,000 x 400的数据框,其中行对应于用户,但每个用户只有两行.
id date ...
1 2012 ...
3 2010 ...
2 2013 ...
2 2014 ...
1 2011 ...
3 2014 ...
Run Code Online (Sandbox Code Playgroud)
我希望对数据进行子集化,以便仅保留每个用户的最新行(即每个id的日期值最高的行).
我首先尝试使用which()
循环语句,其中ids
的ifelse()
语句sapply()
很慢(O(n^2)
我相信).
然后我尝试对df
by进行排序id
,然后以2的增量循环并比较相邻的日期,但这也很慢(我想因为R中的循环是没有希望的).这两个日期的比较是瓶颈,因为排序几乎是即时的.
有没有办法对比较进行矢量化?
解决方案来自删除重复项,保持最大绝对值的输入
aa <- df[order(df$id, -df$date), ] #sort by id and reverse of date
aa[!duplicated(aa$id),]
Run Code Online (Sandbox Code Playgroud)
跑得很快!!
我有一个8,000,000行的数据集,在data.table中有100列,其中每列都是一个计数.我需要找到每行中的最大计数以及该最大值所在的列.
我可以使用快速获取哪一列具有每行的最大值
dt <- dt[, maxCol := which.max(.SD), by=pmxid]
Run Code Online (Sandbox Code Playgroud)
但试图获得实际的最大值
dt <- dt[, nmax := max(.SD), by=pmxid]
Run Code Online (Sandbox Code Playgroud)
非常慢.我跑了近20分钟,计算出最多只有200,000行.找到最大列需要大约.所有8,000,000行的2分钟.
如何找到最大值需要这么长时间?它不应该花费相同的时间which.max()
或更少?
我有一个数据框,其中所有列都有character
类,但许多列应该是数字或整数类.我还有一个包含每列所需类的字符向量,例如
classes <- c("integer", "integer", "numeric", "character", "logical", "numeric", ... )
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来使用此classes
向量快速设置每列的类而不循环.
我希望有一种方法可以做到类似于命名,例如
names(df) <- names
Run Code Online (Sandbox Code Playgroud)
在哪里names
是character
矢量,或者在我的情况下
class(df) <- classes
Run Code Online (Sandbox Code Playgroud)