R 基于唯一值和其他列数据的子集数据帧
我有一个数据帧,它有一系列ID字符(trt、个人和会话): 我知道如何随机选择每个trtxindividual组合的子集:R 基于唯一值和其他列数据的子集数据帧,r,dataframe,data.table,R,Dataframe,Data.table,我有一个数据帧,它有一系列ID字符(trt、个人和会话): 我知道如何随机选择每个trtxindividual组合的子集: > setDT(df) newdf<-df[, .SD[sample(.N, 1)] , by=.(trt, individual)] newdf trt individual session data 1: A Bob 4 4.75145309337952 2: A Nancy
> setDT(df)
newdf<-df[, .SD[sample(.N, 1)] , by=.(trt, individual)]
newdf
trt individual session data
1: A Bob 4 4.75145309337952
2: A Nancy 1 3.29568979189961
3: A Tim 7 6.31062631711196
4: B Bob 8 4.69047076193906
5: B Nancy **2** 4.7158873476798
6: B Tim **2** 5.34401708530548
7: C Bob 6 4.06727142161431
8: C Nancy 9 3.43304058627408
9: C Tim 3 3.7954788384957
>setDT(df)
newdf这将需要遍历data.table
,可能不快,但不需要为感兴趣的字段设置任何参数
library(data.table)
set.seed(7)
setDT(df)
dt1 <- df[, .SD[sample(.N)]]
dt1[, i := .I]
dt1[, flag := NA]
setkey(dt1, flag)
lapply(dt1$i, function(x) {
dt1[is.na(flag[x]) & (trt == trt[x] & individual == individual[x] | session == session[x]), flag := i == x]
})
dt1[flag == TRUE, ]
trt individual session data i flag
1: C Tim 9 3.63712332100071 1 TRUE
2: A Nancy 4 4.54908662150973 2 TRUE
3: A Tim 1 5.84217708521442 3 TRUE
4: B Tim 2 2.37343483362789 5 TRUE
5: C Nancy 3 2.87792051390258 7 TRUE
6: A Bob 7 3.45471592963754 12 TRUE
7: B Nancy 8 4.54792567807183 15 TRUE
8: C Bob 6 4.45667777212948 24 TRUE
9: B Bob 5 2.33285598638319 27 TRUE
库(data.table)
种子(7)
setDT(df)
dt1我认为dft成功了!非常感谢。我试图理解lappy函数在做什么。使用df[,.SD[sample(.N)]随机化数据帧。然后在Lappy中运行函数,该函数接受第一个唯一的trt x单独组合x会话,然后在运行datatable时,它识别具有相同会话号的不同trt x单独组合,并调用这些false?这是正确的,lappy
正在迭代数据。表
找到第一个唯一的组合后,它会将该标志设置为TRUE
,然后通过将标志设置为FALSE
,从考虑中删除无效的未来选择。我添加了一个附加问题(第2部分)作为对我原稿的编辑,因为我认为它可能需要一个新的答案。如果你对如何做到这一点有任何想法,我感谢你的帮助。谢谢@布罗克:这应该是一个新问题,因为它与原来的问题有很大不同。还有,你试过什么吗?这个网站是支持努力和帮助修复错误,但不是为我编码。我会提出一个新的问题。我已经尝试了很多东西,我会把其中一些放在我的问题中,以示努力。
> setDT(df)
newdf<-df[, .SD[sample(.N, 1)] , by=.(trt, individual)]
newdf
trt individual session data
1: A Bob 4 4.75145309337952
2: A Nancy 1 3.29568979189961
3: A Tim 7 6.31062631711196
4: B Bob 8 4.69047076193906
5: B Nancy **2** 4.7158873476798
6: B Tim **2** 5.34401708530548
7: C Bob 6 4.06727142161431
8: C Nancy 9 3.43304058627408
9: C Tim 3 3.7954788384957
library(data.table)
set.seed(7)
setDT(df)
dt1 <- df[, .SD[sample(.N)]]
dt1[, i := .I]
dt1[, flag := NA]
setkey(dt1, flag)
lapply(dt1$i, function(x) {
dt1[is.na(flag[x]) & (trt == trt[x] & individual == individual[x] | session == session[x]), flag := i == x]
})
dt1[flag == TRUE, ]
trt individual session data i flag
1: C Tim 9 3.63712332100071 1 TRUE
2: A Nancy 4 4.54908662150973 2 TRUE
3: A Tim 1 5.84217708521442 3 TRUE
4: B Tim 2 2.37343483362789 5 TRUE
5: C Nancy 3 2.87792051390258 7 TRUE
6: A Bob 7 3.45471592963754 12 TRUE
7: B Nancy 8 4.54792567807183 15 TRUE
8: C Bob 6 4.45667777212948 24 TRUE
9: B Bob 5 2.33285598638319 27 TRUE