R 子集数据仅包含每只动物多次测试值的最低三分之一
我的(合成)数据:R 子集数据仅包含每只动物多次测试值的最低三分之一,r,subset,R,Subset,我的(合成)数据: 我之前误解了你的问题 library(data.table) dat <- data.table(dat) subsetted <- dat[time < 48 & time > 5 , LowestOneThird := (oxygen <= quantile(oxygen, 1/3)), by = c('animal')][LowestOneThird == TRUE] 比如: library(plyr) newdat <-
我之前误解了你的问题
library(data.table)
dat <- data.table(dat)
subsetted <- dat[time < 48 & time > 5 , LowestOneThird := (oxygen <= quantile(oxygen, 1/3)), by = c('animal')][LowestOneThird == TRUE]
比如:
library(plyr)
newdat <- ddply(dat, "animal",
subset,
oxygen <= quantile(oxygen, 1/3) & time >= 5 & time <=48)
## animal oxygen time habitat
## 1 A 25 15 clean
## 2 A 20 11 clean
## 3 B 24 33 clean
## 4 B 24 18 clean
## 5 B 20 17 clean
## 6 C 20 24 dirty
## 7 C 26 39 dirty
## 8 C 26 26 dirty
## 9 D 27 40 dirty
## 10 D 27 48 dirty
## 11 D 22 46 dirty
库(plyr)
newdat您可以通过do.call(rbind)
dat1请检查此项。一个好的可复制的例子将帮助其他人更轻松地解决您的问题。感谢您回答我的问题!不幸的是,似乎有两个问题。首先,虽然它对一些动物给出了正确的答案(例如A和B),但对其他动物给出了错误的答案(例如,对于动物C,氧值应该是20、26、26)。其次,当我运行代码生成“subseted”对象时,收到一条错误消息:eval(expr、envir、enclose)中出错:找不到对象“lowstonetrich”。我试图修复,但没有成功。对于第二条错误消息,我很抱歉,我看到了问题,我将在澄清我对如何选择最低三分之一的怀疑后修复它。对于animal==“C”&time=5
,氧值为C(20,26,26)
。因此,最低的三分之一(分位数(c(20,26,26),1/3)
)只包含20个,不包括26个。你不是这样计算的吗?谢谢你的回答。对不起,看来我错了。我在Excel中对数据进行了排序,发现您的原始输出和解释是正确的(不包括26)。如果您可以修复代码来解决我的错误消息问题,那将非常有帮助。我以为其他两个助手的代码生成了我想要的,但看起来您的代码生成了正确的答案。我想知道你能否告诉我为什么其他助手的代码不能产生与你相同的输出?在他们的代码中,动物C有(20,26,26)。我已经编辑了代码,所以现在不应该出现错误。对于其他答案,我怀疑将条件写为oxygen=5&太好了!成功了。此外,您对ddply函数的修改也起到了作用。非常感谢你!我注意到,正如上面Codoremifa所指出的,提供的代码并没有产生我想要做的事情。请参阅我们上面的通信以及我对本·博尔克的回复。在考虑了Codoremifa的回复(请参阅下面的通信)后,您的代码似乎没有产生我想要的结果。很可能,我不清楚的问题误导了你。无论如何,Codoremifa建议了一些修改,经过修改,您的代码产生了我想要的。
library(data.table)
dat <- data.table(dat)
subsetted <- dat[time < 48 & time > 5 , LowestOneThird := (oxygen <= quantile(oxygen, 1/3)), by = c('animal')][LowestOneThird == TRUE]
> subsetted
animal oxygen time habitat LowestOneThird
1: A 20 11 clean TRUE
2: A 25 15 clean TRUE
3: B 20 17 clean TRUE
4: B 24 18 clean TRUE
5: B 24 33 clean TRUE
6: C 20 24 dirty TRUE
7: D 27 40 dirty TRUE
8: D 22 46 dirty TRUE
library(plyr)
newdat <- ddply(dat, "animal",
subset,
oxygen <= quantile(oxygen, 1/3) & time >= 5 & time <=48)
## animal oxygen time habitat
## 1 A 25 15 clean
## 2 A 20 11 clean
## 3 B 24 33 clean
## 4 B 24 18 clean
## 5 B 20 17 clean
## 6 C 20 24 dirty
## 7 C 26 39 dirty
## 8 C 26 26 dirty
## 9 D 27 40 dirty
## 10 D 27 48 dirty
## 11 D 22 46 dirty
dat1 <- with(dat,by(dat,animal,subset,oxygen <= quantile(oxygen, 1/3) & time >= 5 & time <=48))
> dat1
animal: A
animal oxygen time habitat
5 A 25 15 clean
9 A 20 11 clean
-----------------------------------------------------------------------------------------------------------
animal: B
animal oxygen time habitat
2 B 24 33 clean
14 B 24 18 clean
26 B 20 17 clean
-----------------------------------------------------------------------------------------------------------
animal: C
animal oxygen time habitat
11 C 20 24 dirty
15 C 26 39 dirty
19 C 26 26 dirty
-----------------------------------------------------------------------------------------------------------
animal: D
animal oxygen time habitat
8 D 27 40 dirty
12 D 27 48 dirty
16 D 22 46 dirty
do.call(rbind,dat1)
animal oxygen time habitat
A.5 A 25 15 clean
A.9 A 20 11 clean
B.2 B 24 33 clean
B.14 B 24 18 clean
B.26 B 20 17 clean
C.11 C 20 24 dirty
C.15 C 26 39 dirty
C.19 C 26 26 dirty
D.8 D 27 40 dirty
D.12 D 27 48 dirty
D.16 D 22 46 dirty