根据索引中的 2 个条件为列中的数据分配类别的 R 公式

R formula to assign categories to data in a column based on 2 conditions in an index

提问人:Andrew Lord 提问时间:11/13/2023 最后编辑:Jon SpringAndrew Lord 更新时间:11/13/2023 访问量:22

问:

我在 Google 表格中有 2 张数据表。我想创建一个公式,根据第二张工作表中的信息将一张纸中的数据分为两类。我想找到一个解决方案,要么直接在工作表中使用公式,要么将其带入 R。

我尝试了几种方法来创建公式,但没有成功。

我也在 R 中尝试了几种不同的方法,但还没有找到解决方案。

我已经能够使用 Google sheets 4 库将数据从 google sheet 获取到 R 中。

进入 R 后,我将数据保存在两个对象中,“gs_dfId”和“gs_dfRunsheet”。

一张标有“gs_dfId”的工作表包含一个 Id 键,每个人都有一个数字。ID 号存储在标有“Id”的列中。第二张纸“gs_dfRunsheet”包含密钥中人员进行的交易历史记录。“gs_dfRunsheet”中有 3 列,“Id”列包含与 ID 表对应的每个人相同的 ID 号,“保留”列包含保留的金额,“已输送”列包含已输送的金额。如果某人进行的交易导致名为“Retained”的列中出现零,那么我希望在gs_dfID中添加一个新列,其中有两种颜色,“white”表示保留 0(零)的 Id,“blue”表示所有其他条目,包括空白单元格。可以将新的数据列添加到“gs_dfId”对象中的数据集中。

这是 2 个数据集和谷歌文档的链接。 https://docs.google.com/spreadsheets/d/1jnl-yvI4itmYPvYoggL9pNVHw2r4ktgd_kqBbI0mHow/edit#gid=0

运行表:

Grantor Retained Conveyed
1       
2       
3      0       1
4       
5      0       1
6      1       1
7      0       0
7      0       0
6      0       1
10     0       0
8          0
9      0       0
11     ?       ?
7      ?       ?
7      0       0
11     0       0
8      0       1
10     0       0
13     0       0
13     0       1
13     0       1
15     0       1
10      
16     0       1
18     0       1
19  0.25 LRI   1
20  0.25 LRI    1
20  0.25 LRI?    1
20  0.015625 RI   0.015625 RI

编号:

Id  Color  
1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25

如果运行表中的授予者保留零,那么我希望“颜色”列包含单词“白色”,如果它有除零之外的任何其他条目,包括空白单元格,我希望它具有“蓝色”

我尝试了三种不同的解决方案,但未能成功求解方程式。

首先,我尝试直接在谷歌表格中编写一个谷歌表格公式,以便在数据加载到 R 之前分配颜色。

=IF(AND(INDEX(Runsheet!B:B, MATCH(A2, Runsheet!A:A, 0)) = 0, A2 = INDEX(Runsheet!A:A, MATCH(A2, Runsheet!A:A, 0))), "white", "blue")

其次,我尝试使用带有 ifelse 设置的循环。

找到了这个问题和答案,但还没有弄清楚如何应用它: 在 R 中根据逻辑条件插入列

for (i in 1:nrow(gs_dfId)) {
  # Get the value in column A of the current row in the first sheet
  gs_dfId$Id <- gs_dfId[i, "A"]
  
  # Check if there is a corresponding row with a zero in the second sheet
  if (gs_dfId$Id %in% gs_dfRunsheet$Grantor && gs_dfRunsheet[gs_dfRunsheet$Grantor == gs_dfId$Id, "B"] == 0) {
    # If the condition is met, assign "white" to the current row in column B of the first sheet
    gs_dfId[i, "Color"] <- "white"
  } else {
    # Otherwise, assign "blue" to the current row in column B of the first sheet
    gs_dfId[i, "Color"] <- "blue"
  }
}

第三,我尝试使用tidyverse并设置一个管道。 我也找到了这个问题和答案,但还没有能够理解如何应用它: 在 r 的 data.table 中基于多个条件创建列

result <- gs_dfId %>%
  left_join(gs_dfRunsheet %>% filter(Retained == 0), by = c("Id" = "Grantor")) %>%
  mutate(Color = ifelse(!is.na(Retained.y), "white", "blue")) %>%
  select(-Retained.y)
r if 语句 google-sheets 索引匹配

评论


答: 暂无答案