当前位置: 首页 > 知识库问答 >
问题:

dplyr使用条件列和特定行进行变异

夏侯航
2023-03-14

我有一个带有两个得分列的data.frame。我希望在每行的基础上有条件地使用其中一个的数据。我用下面的一个例子来解释...

> dff <- data.frame(dataset = c('Main','Main','b','b','c','c','d','d'), 
+                  score1 = c(0.01,0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08), 
+                  score2 = c(0.001, 0.2, 0.003, 0.4, 0.005, 0.6, 0.007, 0.8),
+                  name = c('A','B','A','B','A','B','A','B')); 
> dff
  dataset score1 score2 name
1    Main   0.01  0.001    A
2    Main   0.02  0.200    B
3       b   0.03  0.003    A
4       b   0.04  0.400    B
5       c   0.05  0.005    A
6       c   0.06  0.600    B
7       d   0.07  0.007    A
8       d   0.08  0.800    B
  dataset score1 score2 name final
1    Main   0.01  0.001    A 0.001
2    Main   0.02  0.200    B 0.020
3       b   0.03  0.003    A 0.003
4       b   0.04  0.400    B 0.040
5       c   0.05  0.005    A 0.005
6       c   0.06  0.600    B 0.060
7       d   0.07  0.007    A 0.007
8       d   0.08  0.800    B 0.080
structure(list(datasets = c("main", "main", "bms", "bms", "sny", 
"sny", "chen", "chen", "van", "van"), test_high = c(0.639654382299527, 
0.561881930194033, NA, NA, 0.909598942079794, 0.651429614317738, 
0.189274551669056, 0.541845226349475, 0.41969855766237, 0.555858598773613
), test_low = c(0.402779917451124, 0.469868712458501, NA, NA, 
0.106383376175001, 0.381060050671353, 0.824427629626441, 0.468590829264603, 
0.594646024750062, 0.460036802365713), cell = c("high", "low", 
"low", "high", "high", "low", "high", "low", "low", "high")), .Names = c("datasets", 
"test_high", "test_low", "cell"), class = c("tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -10L))


   # A tibble: 10 x 4
   datasets test_high  test_low  cell
      <chr>     <dbl>     <dbl> <chr>
 1     main 0.6396544 0.4027799  high
 2     main 0.5618819 0.4698687   low
 3      bms        NA        NA   low
 4      bms        NA        NA  high
 5      sny 0.9095989 0.1063834  high
 6      sny 0.6514296 0.3810601   low
 7     chen 0.1892746 0.8244276  high
 8     chen 0.5418452 0.4685908   low
 9      van 0.4196986 0.5946460   low
10      van 0.5558586 0.4600368  high

在这种情况下,Final最终将与test_low相同,因为对于两个Mains(即,当单元格为'high'时,单元格为'low时),test_low列小于test_high列。

共有1个答案

濮书
2023-03-14

一个选项是case_when

library(dplyr)
dff %>%
    mutate(final =  case_when(name == "A" & dataset == "Main" ~ score2,
                       name == "B" & dataset=="Main" ~score1, 
                       TRUE ~ pmin(score1, score2)))
#  dataset score1 score2 name final
#1    Main   0.01  0.001    A 0.001
#2    Main   0.02  0.200    B 0.020
#3       b   0.03  0.003    A 0.003
#4       b   0.04  0.400    B 0.040
#5       c   0.05  0.005    A 0.005
#6       c   0.06  0.600    B 0.060
#7       d   0.07  0.007    A 0.007
#8       d   0.08  0.800    B 0.080

基于已编辑的数据集('DFN'),

dfn %>%
     filter(datasets == "main") %>% 
     gather(test, val, test_high:test_low) %>% 
     group_by(cell) %>% 
     summarise(test = test[which.max(val)]) %>% 
     left_join(dfn, .) %>%
     rowwise() %>% 
     mutate(final = get(test)) %>%
     select(-test)
 类似资料:
  • 在一个有四列的大数据框(“myfile”)中,我必须添加第五列,其中的值有条件地基于前四列。 更喜欢使用和的答案,主要是因为它在大型数据集中的速度。 我的数据框如下所示: 第五列(V5)的值基于一些条件规则: 现在我想使用函数在所有行上使用这些规则(以避免慢循环)。类似这样的事情(是的,我知道这样不行!): 结果应该是: 如何在dplyr中执行此操作?

  • 我正在尝试使用创建一个新列,该列的值基于特定的列。 最后一个数据帧示例(我正在尝试创建): 这个问题基本上与此相反:dplyr-mutate:使用动态变量名。我不能使解决方案适应我的问题。

  • 我试图计算许多列的行平均值。有人能解释一下为什么下面的代码只计算代码中两个变量(var_1和var_13)的平均值,而不是所有13列的平均值吗?

  • 我有一个名称重复的数据集。如果名称重复,我想创建一个值为1(TRUE)或0(FALSE)的新列。 这是我使用的代码: 或者 然而,我得到了上面可以看到的错误。 另一个想法是使用group_by,然后计算计数。喜欢: 但是,它不能返回原始数据帧后group_by

  • 我已经更新了dplyr(现在是0.7.1),我的很多旧代码都不能用了,因为mutate_each已经被弃用了。我曾经用mutate_each做类似这样的事情(代码如下),使用列索引。我会在数百个专栏中这样做。而我就是搞不清楚如何用mutate_at正确使用vars参数。我看到的所有例子都使用了列名...我不想这么做。我确信这是一个简单的答案,但是我已经花了太多的时间试图弄明白它,并且将非常感谢一些

  • 我试图计算在一个Tibble中源向量和比较向量之间的Jaccard相似度。 jaccard_sim中的所有值都为零。但是,如果我们运行类似这样的东西,我们得到第一个条目的正确的Jaccard相似度为0.2: