取 data.frame 具有相同特征的子集和 select 每个子集中的一行
Take the subsets of a data.frame with the same feature and select a single row from each subset
假设我在 R 中有一个矩阵如下:
ID Value
1 10
2 5
2 8
3 15
4 7
4 9
...
我需要的是一个随机样本,其中每个元素只代表一次。
这意味着将选择 ID 1,将选择 ID 2 的两行之一,将选择 ID 3,选择 ID 4 的两行之一,依此类推...
可以有两个以上的重复项。
我正在尝试找出最符合 R 风格的方法来执行此操作,而无需对子集进行子集化和采样?
谢谢!
你可以像这样用 dplyr 做到这一点:
library(dplyr)
df %>% group_by(ID) %>% sample_n(1)
想法是对行进行随机重新排序,然后按该顺序删除重复项。
df <- read.table(text="ID Value
1 10
2 5
2 8
3 15
4 7
4 9", header=TRUE)
df2 <- df[sample(nrow(df)), ]
df2[!duplicated(df2$ID), ]
tapply
穿过 rownames
并在每个 ID
组中抓取 sample
个 1
:
dat[tapply(rownames(dat),dat$ID,FUN=sample,1),]
# ID Value
#1 1 10
#3 2 8
#4 3 15
#6 4 9
如果您的数据确实是 matrix
而不是 data.frame
,您也可以解决此问题,方法是:
dat[tapply(as.character(seq(nrow(dat))),dat$ID,FUN=sample,1),]
不要试图删除 as.character
,因为 sample
在只有一个值传递给它时会产生意想不到的结果。例如。
replicate(10, sample(4,1) )
#[1] 1 1 4 2 1 2 2 2 3 4
假设我在 R 中有一个矩阵如下:
ID Value
1 10
2 5
2 8
3 15
4 7
4 9
...
我需要的是一个随机样本,其中每个元素只代表一次。
这意味着将选择 ID 1,将选择 ID 2 的两行之一,将选择 ID 3,选择 ID 4 的两行之一,依此类推...
可以有两个以上的重复项。
我正在尝试找出最符合 R 风格的方法来执行此操作,而无需对子集进行子集化和采样?
谢谢!
你可以像这样用 dplyr 做到这一点:
library(dplyr)
df %>% group_by(ID) %>% sample_n(1)
想法是对行进行随机重新排序,然后按该顺序删除重复项。
df <- read.table(text="ID Value
1 10
2 5
2 8
3 15
4 7
4 9", header=TRUE)
df2 <- df[sample(nrow(df)), ]
df2[!duplicated(df2$ID), ]
tapply
穿过 rownames
并在每个 ID
组中抓取 sample
个 1
:
dat[tapply(rownames(dat),dat$ID,FUN=sample,1),]
# ID Value
#1 1 10
#3 2 8
#4 3 15
#6 4 9
如果您的数据确实是 matrix
而不是 data.frame
,您也可以解决此问题,方法是:
dat[tapply(as.character(seq(nrow(dat))),dat$ID,FUN=sample,1),]
不要试图删除 as.character
,因为 sample
在只有一个值传递给它时会产生意想不到的结果。例如。
replicate(10, sample(4,1) )
#[1] 1 1 4 2 1 2 2 2 3 4