Hen*_*nry 12 r sample dataframe
有没有一种从数据帧的一部分获取行样本的好方法?
如果我只是有数据,如
gender <- c("F", "M", "M", "F", "F", "M", "F", "F")
age <- c(23, 25, 27, 29, 31, 33, 35, 37)
Run Code Online (Sandbox Code Playgroud)
然后我可以轻松地抽取三个Fs的年龄
sample(age[gender == "F"], 3)
Run Code Online (Sandbox Code Playgroud)
得到类似的东西
[1] 31 35 29
Run Code Online (Sandbox Code Playgroud)
但是如果我将这些数据转换为数据帧
mydf <- data.frame(gender, age)
Run Code Online (Sandbox Code Playgroud)
我不能用明显的
sample(mydf[mydf$gender == "F", ], 3)
Run Code Online (Sandbox Code Playgroud)
虽然我可以用一些荒谬的括号来编造一些令人费解的东西
mydf[sample((1:nrow(mydf))[mydf$gender == "F"], 3), ]
Run Code Online (Sandbox Code Playgroud)
得到我想要的东西
gender age
7 F 35
4 F 29
1 F 23
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法让我花更少的时间来研究如何写?
mat*_*fee 19
你的复杂方式几乎是如何做到的 - 我认为所有答案都将是该主题的变化.
例如,我想首先生成mydf$gender=="F"索引:
idx <- which(mydf$gender=="F")
Run Code Online (Sandbox Code Playgroud)
然后我从那里抽样:
mydf[ sample(idx,3), ]
Run Code Online (Sandbox Code Playgroud)
因此,在一行中(尽管如此,您减少了括号的荒谬数量,并且可能通过使用多行来使您的代码更容易理解):
mydf[ sample( which(mydf$gender=='F'), 3 ), ]
Run Code Online (Sandbox Code Playgroud)
虽然"我是黑客!" 我的一部分更喜欢单行,我的明智部分说尽管双线是两条线,但它更容易理解 - 它只是你的选择.
你说我不能用明显的:
sample(mydf[mydf$gender == "F", ], 3)
Run Code Online (Sandbox Code Playgroud)
但你可以编写自己的函数来做到这一点:
sample.df <- function(df, n) df[sample(nrow(df), n), , drop = FALSE]
Run Code Online (Sandbox Code Playgroud)
然后在您的子集选择上运行它:
sample.df(mydf[mydf$gender == "F", ], 3)
# gender age
# 5 F 31
# 4 F 29
# 1 F 23
Run Code Online (Sandbox Code Playgroud)
(就个人而言,我觉得sample.df(subset(mydf, gender == "F"), 3)更容易阅读.)