繁体   English   中英

R 代码,用于根据列值从数据帧中迭代随机删除整行,并每次保存为新数据帧

[英]R code to iteratively and randomly delete entire rows from a data frame based on a column value, and saving as a new data frame each time

如果之前有人问过这个问题,请原谅我!

所以我有一个 dataframe (df) 从不同人群中采样的个体,每个个体都给出了一个人群名称和分配给该人群的相应编号,如下所示:

Individual  Population  Popnum
ALM16-014   AimeesMdw   1
ALM16-024   AimeesMdw   1
ALM16-026   AimeesMdw   1
ALM16-003   AMKRanch    2
ALM16-022   AMKRanch    2
ALM16-075   BearPawLake 3
ALM16-076   BearPawLake 3
ALM16-089   BearPawLake 3

此文件中共有 12 个命名种群(它们的个体数量不同),Popnum 为 1-12。 我需要做的是从 dataframe 中随机删除一个或多个种群(最好使用“Popnum”列)并重复此 100 次,然后将每个结果保存为单独的 dataframe(即 df1、df2、df3 等) 最终结果是 100 个 dfs,每个 dfs 随机删除一个总体。 下一步是重复此操作 100 次,删除两个随机群体,然后是 3 个随机群体,依此类推。

任何帮助将不胜感激!!

您可以编写一个 function ,它将 dataframe 作为输入和n即要删除的Popnum数量。

remove_n_Popnum <- function(data, n) {
   subset(data, !Popnum %in% sample(unique(Popnum), n))
}

要获得一个popnum ,您可以执行以下操作:

remove_n_Popnum(df, 1)

#  Individual Population Popnum
#1  ALM16-014  AimeesMdw      1
#2  ALM16-024  AimeesMdw      1
#3  ALM16-026  AimeesMdw      1
#4  ALM16-003   AMKRanch      2
#5  ALM16-022   AMKRanch      2

要执行此操作 100 次,您可以使用replicate

list_data <- replicate(100, remove_n_Popnum(df1, 1), simplify = FALSE)

要在remove_n_Popnum function 中传递不同的n ,您可以使用lapply

nested_list_data <- lapply(seq_along(unique(df$Popnum)[-1]), 
          function(x) replicate(100, remove_n_Popnum(df, x), simplify = FALSE))

其中seq_along生成的序列比唯一值的数量少 1。

seq_along(unique(df$Popnum)[-1])
#[1] 1 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM