R 基于唯一值将函数应用于数据帧
我需要对数据帧应用一个函数,通过唯一值进行子集或分组 我的数据如下所示:R 基于唯一值将函数应用于数据帧,r,function,unique,lapply,rbind,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
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
我的目标是创建一个新的data.frame,为每个唯一的麋鹿ID在每个日期随机选择4行。
如果我手工操作,对于每个唯一的麋鹿ID,我的代码如下:
oneelk这是一个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行时,这才有效。这里是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
注意,只有当麋鹿ID和JulDate的每个组合至少有4行时,这才有效。尝试使用两列进行拆分,可能是splitdataset,dataset[,cELK_ID,JulDate]尝试使用两列进行拆分,可能是splitdataset,dataset[,cELK_ID,JulDate]您还可以使用tapply创建索引,然后使用名为df的数据集创建子集
您还可以使用tapply创建索引,然后假设您的数据集为df 还可以添加一个dplyr解决方案:
library(dplyr)
newdf <- yourdata %>%
group_by(ELK_ID, JulDate) %>%
sample_n(4)
还可以添加一个dplyr解决方案:
library(dplyr)
newdf <- yourdata %>%
group_by(ELK_ID, JulDate) %>%
sample_n(4)
使用{}按钮将数据放入代码块。使用{}按钮将数据放入代码块。感谢您提供的解决方案,不幸的是,我确实有一些ELK_ID少于4个日期。然后使用sample.N,min.N,4而不是sample.N,4。这将随机抽取最多4行的样本。感谢您提供的解决方案,不幸的是,我确实有一些麋鹿ID的日期少于4个。然后使用sample.N,min.N,4代替sample.N,4。这将随机抽取行数为多少的样本,最多4行。当我定义indx时,我得到一个错误,即“参数必须具有相同的长度”。我知道ELK_ID的每个值都有一个对应的JulDate值,所以我不确定为什么会出现错误。之所以出现此错误,是因为您将数据集转换为data.table对象,首先运行了@jihoward code。如果您想让它工作,请在原始数据集上运行它当我定义indx时,我得到一个错误,即“参数的长度必须相同”。我知道ELK_ID的每个值都有一个对应的JulDate值,所以我不确定为什么会出现错误。之所以出现此错误,是因为您将数据集转换为data.table对象,首先运行了@jihoward code。如果你想让它工作,在你的原始数据集上运行它。我想这正是我想要的,但我需要管理员批准才能更新我的R版本,这样我才能访问dplyr。会让你知道事情的进展!谢谢librarydata.table解决方案在不必更新我的R版本的情况下就可以工作。不过,感谢您的帮助!我想这正是我想要的,但我需要管理员批准才能更新我的R版本,这样我才能访问dplyr。会让你知道事情的进展!谢谢librarydata.table解决方案在不必更新我的R版本的情况下就可以工作。不过,感谢您的帮助!