根据唯一值将函数应用于数据框

时间:2014-12-11 22:11:15

标签: r function unique lapply rbind

我需要将函数应用于数据帧,按唯一值进行子集化或分组。

我的数据如下:

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 ,所以我需要自动化该过程。 请帮忙!

4 个答案:

答案 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_IDJulDate的每个组合至少有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)