我有一个数据集,我需要在其中找到数字上方和下方的值(本例中为 1.1)。这就是我所做的:
df1 <- data.frame(da=c(2.9245,2.8585,2.5225,2.0145,1.1715,0.5075,0.2645,0.0915),
d2=c(2.912375,2.703375,2.502375,2.025375,1.110375,0.535375,0.243375,0.072375),
Blank...25=c(0.058,0.060,0.059,0.080,0.059,0.066,0.085,0.105),
dilution=c(1:8))
titers_long2 <- df1 |>
mutate(dilution = dilution) |>
pivot_longer(-dilution)
titers2 <- titers_long2|>
group_by(name) |>
reframe(belowt = value[which(value == max(value[value<=1.1]))],
abovet = value[which(value == min(value[value >=1.1]))],
belowdil = dilution[which(value == max(value[value<=1.1]))],
abovedil = dilution[which(value == min(value[value >=1.1]))]
)
这适用于警告,它会针对不符合条件的名称发出警告(在本例中为空白...25,其中所有值都是 <1.1).
但是,如果我为空白使用不同名称的数据框(在本例中为空白...37),代码的行为会有所不同,如下所示:
df2 <- data.frame(da=c(2.9245,2.8585,2.5225,2.0145,1.1715,0.5075,0.2645,0.0915),
d2=c(2.912375,2.703375,2.502375,2.025375,1.110375,0.535375,0.243375,0.072375),
Blank...37=c(0.054,0.060,0.057,0.085,0.078,0.067,0.063,0.085),
dilution=c(1:8))
titers_long2 <- df2 |>
mutate(dilution = dilution) |>
pivot_longer(-dilution)
titers2 <- titers_long2|>
group_by(name) |>
reframe(belowt = value[which(value == max(value[value<=1.1]))],
abovet = value[which(value == min(value[value >=1.1]))],
belowdil = dilution[which(value == max(value[value<=1.1]))],
abovedil = dilution[which(value == min(value[value >=1.1]))]
)
使用
df2
运行代码给我一个错误:
Error in `reframe()`:
! Can't recycle `abovet = value[which(value == min(value[value >= 1.1]))]`.
ℹ In group 1: `name = "Blank...37"`.
Caused by error:
! `abovet` must be size 2 or 1, not 0.
ℹ An earlier column had size 2.
为什么代码与
df1
和 df2
的行为不同?我该如何修复它?
这适用于两个数据框,重用已经计算的最小/最大值
df1 %>%
pivot_longer(-dilution) %>%
summarize(bval = max(value[which(value <= 1.1)]),
aval = min(value[which(value > 1.1)]),
bdil = max(dilution[bval == value]),
adil = min(dilution[aval == value]), .by = name) %>%
suppressWarnings()
# A tibble: 3 × 5
name bval aval bdil adil
<chr> <dbl> <dbl> <int> <dbl>
1 da 0.507 1.17 6 5
2 d2 0.535 1.11 6 5
3 Blank...25 0.105 Inf 8 Inf
df2 %>%
pivot_longer(-dilution) %>%
summarize(bval = max(value[which(value <= 1.1)]),
aval = min(value[which(value > 1.1)]),
bdil = max(dilution[bval == value]),
adil = min(dilution[aval == value]), .by = name) %>%
suppressWarnings()
# A tibble: 3 × 5
name bval aval bdil adil
<chr> <dbl> <dbl> <int> <dbl>
1 da 0.507 1.17 6 5
2 d2 0.535 1.11 6 5
3 Blank...37 0.085 Inf 8 Inf