R dplyr 重构警告与基于数据集的错误

问题描述 投票:0回答:1

我有一个数据集,我需要在其中找到数字上方和下方的值(本例中为 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
的行为不同?我该如何修复它?

r dplyr warnings
1个回答
0
投票

这适用于两个数据框,重用已经计算的最小/最大值

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
© www.soinside.com 2019 - 2024. All rights reserved.