我需要将函数应用于数据帧,按唯一值进行子集化或分组。
我的数据如下:
FID FIX_NO ELK_ID ALTITUDE XLOC YLOC DATE_TIME JulDate
1 NA 5296 393 2260.785 547561.3 4771900 NA 140
2 NA 5297 393 2254.992 547555.9 4771906 NA 140
3 NA 5298 393 2256.078 547563.5 4771901 NA 140
4 NA 5299 393 2247.047 547564.7 4771907 NA 140
5 NA 5300 393 2264.875 547558.3 4771903 NA 140
6 NA 5301 393 2259.496 547554.1 4771925 NA 140
...
24247 NA 4389 527 2204.047 558465.7 4775358 NA 161
24248 NA 4390 527 2279.078 558884.1 4775713 NA 161
24249 NA 4391 527 2270.590 558807.9 4775825 NA 161
24250 NA 4392 527 2265.258 558732.2 4775805 NA 161
24251 NA 4393 527 2238.375 558672.4 4775781 NA 161
24252 NA 4394 527 2250.055 558686.6 4775775 NA 161
我的目标是通过为每个唯一的ELK_ID为每个JulDate随机选择4行来创建新的data.frame。 如果我手工完成,对于每个唯一的ELK_ID,我的代码如下:
oneelk <- subset(dataset, ELK_ID == 393)
newdata <- do.call(rbind,lapply(split(oneelk,oneelk$JulDate),
function(x)x[sample(1:nrow(x),4),]))
&gt; 40个ELK_ID ,所以我需要自动化该过程。 请帮忙!
答案 0 :(得分:2)
这是一个data.table解决方案。
library(data.table)
setDT(dataset)[,.SD[sample(.N,4)],by=list(ELK_ID,JulDate)]
# ELK_ID JulDate FID FIX_NO ALTITUDE XLOC YLOC DATE_TIME
# 1: 393 140 NA 5297 2254.992 547555.9 4771906 NA
# 2: 393 140 NA 5299 2247.047 547564.7 4771907 NA
# 3: 393 140 NA 5298 2256.078 547563.5 4771901 NA
# 4: 393 140 NA 5300 2264.875 547558.3 4771903 NA
# 5: 527 161 NA 4394 2250.055 558686.6 4775775 NA
# 6: 527 161 NA 4392 2265.258 558732.2 4775805 NA
# 7: 527 161 NA 4390 2279.078 558884.1 4775713 NA
# 8: 527 161 NA 4393 2238.375 558672.4 4775781 NA
注意,这仅适用于ELK_ID
和JulDate
的每个组合至少有4行的情况。
答案 1 :(得分:2)
您还可以使用tapply
创建索引,然后只使用子集(假设您的数据集名为df
)
indx <- unlist(tapply(seq_len(dim(df)[1L]),
df[, c("JulDate", "ELK_ID")],
function(x) sample(x, 4)))
df[indx, ]
答案 2 :(得分:1)
尝试使用两列进行拆分,可能是split(dataset, dataset[, c("ELK_ID", "JulDate")])
答案 3 :(得分:0)
也可以添加dplyr
解决方案:
library(dplyr)
newdf <- yourdata %>%
group_by(ELK_ID, JulDate) %>%
sample_n(4)