子集化,dat[13:24,2] 不 return 我在这种情况下所期望的
Subsetting, dat[13:24,2] does not return what I expected in this case
我正在尝试在 R 中进行子集化。
我有一个数据集,其中包含名为 Diet
和 Bodyweight
的两列。
1:12
行是对照观察值,我想得到对照组 Bodyweight
列的平均值。
所以我用这个:mean(dat[1:12,2])
然后我想知道有多少非对照观察值(行13:24)小于对照观察值(行1:12)的平均值。
所以我用了这个:
dat[dat[13:24,2] < mean(dat[1:12,2]), ]
这给了我这个:
Diet Bodyweight
3 chow 24.04
10 chow 20.10
12 chow 26.25
15 hf 22.80
22 hf 21.90
24 hf 20.73
但我期待它 return 像这样,其中不包括 1:12 行:
Diet Bodyweight
15 hf 22.80
22 hf 21.90
24 hf 20.73
我该如何实现?
*编辑:dput() 结果:
> dput(dat)
structure(list(Diet = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L), .Label = c("chow", "hf"), class = "factor"), Bodyweight = c(21.51,
28.14, 24.04, 23.45, 23.68, 19.79, 28.4, 20.98, 22.51, 20.1,
26.91, 26.25, 25.71, 26.37, 22.8, 25.34, 24.97, 28.14, 29.58,
30.92, 34.02, 21.9, 31.53, 20.73)), .Names = c("Diet", "Bodyweight"
), class = "data.frame", row.names = c(NA, -24L))
如果您不知道行号并且不知道其他测试变量的名称(如果您的测试变量多于 "hf")但知道 "chow"饮食是你的控制,你可以这样做:
library(dplyr)
df %>% filter(Diet != "chow", Bodyweight < mean(Bodyweight[Diet == "chow"]))
哪个returns:
# Diet Bodyweight
#1 hf 22.80
#2 hf 21.90
#3 hf 20.73
分两步完成。首先获取目标行,然后应用逻辑选择:
> dat[ 13:24, ][dat[13:24,2] < mean(dat[1:12,2]), ]
Diet Bodyweight
15 hf 22.80
22 hf 21.90
24 hf 20.73
您可以将对“[”的调用链接在一起。对“[”的第二次调用只是选择具有 12 项逻辑向量的行,但由于它是从同一组值创建的,因此它是 "syncronized".
如果您不知道行号,也可以使用名称和值。
df[with(df, Diet == "hf" & Bodyweight < mean(Bodyweight[Diet == "chow"])), ]
# Diet Bodyweight
# 15 hf 22.80
# 22 hf 21.90
# 24 hf 20.73
要真正提高易读性,请对数据集进行分区 - 如果您在很多列上进行大量比较控制与非控制,这将有所帮助。魔术行索引被认为是不好的 - 很容易出错:
# Add a column to split into control/non-control
dat$control <- c(rep(T,12),rep(F,12))
# Get aliases for those partitions... (this makes a copy of the whole df)
dat_n <- dat[dat$control==F,]
dat_c <- dat[dat$control==T,]
# Now the expression is waaay more legible and self-explanatory
dat_n[ dat_n$Bodyweight < mean(dat_c$Bodyweight) ,]
# Diet Bodyweight control
# 3 hf 22.80 FALSE
# 10 hf 21.90 FALSE
# 12 hf 20.73 FALSE
我正在尝试在 R 中进行子集化。
我有一个数据集,其中包含名为 Diet
和 Bodyweight
的两列。
1:12
行是对照观察值,我想得到对照组 Bodyweight
列的平均值。
所以我用这个:mean(dat[1:12,2])
然后我想知道有多少非对照观察值(行13:24)小于对照观察值(行1:12)的平均值。
所以我用了这个:
dat[dat[13:24,2] < mean(dat[1:12,2]), ]
这给了我这个:
Diet Bodyweight
3 chow 24.04
10 chow 20.10
12 chow 26.25
15 hf 22.80
22 hf 21.90
24 hf 20.73
但我期待它 return 像这样,其中不包括 1:12 行:
Diet Bodyweight
15 hf 22.80
22 hf 21.90
24 hf 20.73
我该如何实现?
*编辑:dput() 结果:
> dput(dat)
structure(list(Diet = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L), .Label = c("chow", "hf"), class = "factor"), Bodyweight = c(21.51,
28.14, 24.04, 23.45, 23.68, 19.79, 28.4, 20.98, 22.51, 20.1,
26.91, 26.25, 25.71, 26.37, 22.8, 25.34, 24.97, 28.14, 29.58,
30.92, 34.02, 21.9, 31.53, 20.73)), .Names = c("Diet", "Bodyweight"
), class = "data.frame", row.names = c(NA, -24L))
如果您不知道行号并且不知道其他测试变量的名称(如果您的测试变量多于 "hf")但知道 "chow"饮食是你的控制,你可以这样做:
library(dplyr)
df %>% filter(Diet != "chow", Bodyweight < mean(Bodyweight[Diet == "chow"]))
哪个returns:
# Diet Bodyweight
#1 hf 22.80
#2 hf 21.90
#3 hf 20.73
分两步完成。首先获取目标行,然后应用逻辑选择:
> dat[ 13:24, ][dat[13:24,2] < mean(dat[1:12,2]), ]
Diet Bodyweight
15 hf 22.80
22 hf 21.90
24 hf 20.73
您可以将对“[”的调用链接在一起。对“[”的第二次调用只是选择具有 12 项逻辑向量的行,但由于它是从同一组值创建的,因此它是 "syncronized".
如果您不知道行号,也可以使用名称和值。
df[with(df, Diet == "hf" & Bodyweight < mean(Bodyweight[Diet == "chow"])), ]
# Diet Bodyweight
# 15 hf 22.80
# 22 hf 21.90
# 24 hf 20.73
要真正提高易读性,请对数据集进行分区 - 如果您在很多列上进行大量比较控制与非控制,这将有所帮助。魔术行索引被认为是不好的 - 很容易出错:
# Add a column to split into control/non-control
dat$control <- c(rep(T,12),rep(F,12))
# Get aliases for those partitions... (this makes a copy of the whole df)
dat_n <- dat[dat$control==F,]
dat_c <- dat[dat$control==T,]
# Now the expression is waaay more legible and self-explanatory
dat_n[ dat_n$Bodyweight < mean(dat_c$Bodyweight) ,]
# Diet Bodyweight control
# 3 hf 22.80 FALSE
# 10 hf 21.90 FALSE
# 12 hf 20.73 FALSE