Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于唯一值和其他列数据的子集数据帧_R_Dataframe_Data.table - Fatal编程技术网

R 基于唯一值和其他列数据的子集数据帧

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

我有一个数据帧,它有一系列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       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