【问题标题】:subset a data frame based on different groups of rows in r根据 r 中的不同行组对数据框进行子集化
【发布时间】:2014-03-27 09:21:26
【问题描述】:

20 小时后仍未得到答复!我想我必须简化我的问题:

我有 104 个文件(我将它们全部放在一个数据框中)。每个文件有 6 列。第一列可分为 50 组。对于这 50 个组中的每一个,每个文件都有不同数量的记录。我只需要保存 1000 条记录。我尝试了一个嵌套的 for 循环,但它不起作用。


我必须对一个包含 4911703 行(obs.)的 6 个变量的大文件进行排序。 (Kindly, you can download a brief scheme of this data frame here)

数据框有 6 列,V1、V2、V3、V4、V5、V6。

在这个文件中,V1 有 50 个不同的编号,称为主题(451、452、...、500),V6 有 104 个不同的系统名称。 V6 中的每个系统对于 V1 中的每个数字(主题)都有大约 1000 条记录。例如451 有 1000 条记录,452 有 1000 条记录,依此类推。我必须对这个数据框进行排序。我在 plyr 包中使用 arrange() 做到了这一点。因此,其中一列“V4(等级)”未排序,我必须通过添加一个名为“new_rank”的新列来重新排列数据。我在这个重新排名中使用了“嵌套的”。

for(i in 1:50){
   for(i in 1:?)
    clean_file["newRank"] <- 0:1000
} 

问题:不幸的是,V1 中每个主题的系统记录并不相等。一个系统可能有 451 条记录 1045 条,而另一个系统可能有 1345 条记录。所以,J 在第二个“for”中遇到了问题。 由于 V1 中的每个主题只需要 1000 条记录,因此我尝试在重新排序之前对数据框进行子集化。但我不知道该怎么做!换句话说,对于 V6 [104 x 1000 x 50] 中的每 104 个系统,我希望 V1 中的每个主题只有 1000 条记录。我想知道是否有人可以帮助我解决这个问题。提前致谢。

PS:我阅读了list.files and ldply(file, readt.table) 的104 个文件来制作这个巨大的文件。我试图在多个数据帧而不是一个数据帧中读取这 104 个文件,但我再次遇到了失败。

【问题讨论】:

  • 这里不需要for 循环。您要对数据进行排序的变量是什么?另外,我不想下载您的文件,请在您的数据集上运行 deput 并在此处发布
  • @Dave 冒着被弄傻的风险,请问你对数据集的“deput”是什么意思?

标签: r for-loop subset


【解决方案1】:

您可以使用 data.table 包在一行中完成。假设“数据”是您的数据集,并且您希望按以下顺序对数据进行排序 V2 -> V3 -> V4 -> V5 -> V6(您可以在order( 中将顺序更改为您喜欢的任何内容)函数),那么你应该这样做:

library(data.table)
shortdata <- as.data.frame(data.table(data)[order(V2, V3, V4, V5, V6), head(.SD, 1000), by = "V1"])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 2020-10-17
    • 2021-12-03
    • 1970-01-01
    • 2021-12-04
    • 2021-10-13
    相关资源
    最近更新 更多