在R中执行不同列中不同行中的数据之间的转换?

dsf9zpds  于 2023-06-27  发布在  其他
关注(0)|答案(2)|浏览(138)

我有一个dataframe,看起来像这样:
| 一个|B| C类|
| - -----|- -----|- -----|
| 标准|2|不适用|
| 数据1|不适用|4|
| 数据2|不适用|八|
| 数据3|不适用|十六|
| 标准|三个|不适用|
| 数据4|不适用|九个|
| 数据5|不适用|二十七|
| 数据6|不适用|八十一|
最后,我想做的是根据公式将列C转换为另一个数字,使用列B的数据作为公式中的因子。理想地,这将进入第四列(D)。
对于与该对照值相关的所有样品,公式将是(B/16)*C。
所以最终的产品看起来像这样:
| 一个|B| C类|D级|
| - -----|- -----|- -----|- -----|
| 标准|2|不适用|不适用|
| 数据1|不适用|4| X型|
| 数据2|不适用|八|X型|
| 数据3|不适用|十六|X型|
| 标准|三个|不适用|不适用|
| 数据4|不适用|九个|X型|
| 数据5|不适用|二十七|X型|
| 数据6|不适用|八十一|X型|
实际上,我之前已经做过很多次了,但总是在B列被填满的时候。我从来没有用这种设置在行之间做过计算。
我看到的很多东西都是在两列都被填充的情况下引导人们进行计算,但我对如何执行这种转换有点困惑。
先谢谢你了!

ldfqzlk8

ldfqzlk81#

使用dplyr的方法。
我解释这个问题,即公式应该以A == "Standard"为单位分组应用,因此假设数据集已经相应地排序。

  1. library(dplyr)
  2. df %>%
  3. mutate(log = A %in% "Standard", grp = cumsum(log)) %>%
  4. mutate(D = ifelse(!is.na(C), (B[log]/16)*C, NA), .by = grp) %>%
  5. select(-c(grp, log))
  6. A B C D
  7. 1 Standard 2 NA NA
  8. 2 Data1 NA 4 0.5000
  9. 3 Data2 NA 8 1.0000
  10. 4 Data3 NA 16 2.0000
  11. 5 Standard 3 NA NA
  12. 6 Data4 NA 9 1.6875
  13. 7 Data5 NA 27 5.0625
  14. 8 Data6 NA 81 15.1875
展开查看全部
vohkndzv

vohkndzv2#

  1. library(tidyverse)
  2. df %>%
  3. fill(B)%>%
  4. mutate(D = B * C/16)
  5. A B C D
  6. 1 Standard 2 NA NA
  7. 2 Data1 2 4 0.5000
  8. 3 Data2 2 8 1.0000
  9. 4 Data3 2 16 2.0000
  10. 5 Standard 3 NA NA
  11. 6 Data4 3 9 1.6875
  12. 7 Data5 3 27 5.0625
  13. 8 Data6 3 81 15.1875

在碱R中:

  1. transform(df, D = B[cummax(seq_along(B)*!is.na(B))]*C/16)
  2. A B C D
  3. 1 Standard 2 NA NA
  4. 2 Data1 NA 4 0.5000
  5. 3 Data2 NA 8 1.0000
  6. 4 Data3 NA 16 2.0000
  7. 5 Standard 3 NA NA
  8. 6 Data4 NA 9 1.6875
  9. 7 Data5 NA 27 5.0625
  10. 8 Data6 NA 81 15.1875
  1. transform(df, D = B[which(!is.na(B))[cumsum(A=='Standard')]] * C/16)
  2. A B C D
  3. 1 Standard 2 NA NA
  4. 2 Data1 NA 4 0.5000
  5. 3 Data2 NA 8 1.0000
  6. 4 Data3 NA 16 2.0000
  7. 5 Standard 3 NA NA
  8. 6 Data4 NA 9 1.6875
  9. 7 Data5 NA 27 5.0625
  10. 8 Data6 NA 81 15.1875
  1. f <- function(val)Reduce(\(x,y)if(is.na(y))x else y, val, accumulate = TRUE)
  2. transform(df, D = f(B)* C/16)
  3. A B C D
  4. 1 Standard 2 NA NA
  5. 2 Data1 NA 4 0.5000
  6. 3 Data2 NA 8 1.0000
  7. 4 Data3 NA 16 2.0000
  8. 5 Standard 3 NA NA
  9. 6 Data4 NA 9 1.6875
  10. 7 Data5 NA 27 5.0625
  11. 8 Data6 NA 81 15.1875
展开查看全部

相关问题