r - 使用 dplyr 和 mutate 对多列中的每一列使用单独的条件

标签 r dplyr

我正在尝试计算多列(t1、t2、t3)中唯一字符的数量,并将该值放入一个新变量中。一个字符是否被计数取决于它与 (p1,p2,p3) 关联的另一列的值是否大于或等于 0.05。例如。我有以下数据集:

dat <- data.frame(id = c(1,2,3,4,5),t1 = c('a','a','b','b','c'),
            p1 = c(0.98,1,0.5,0.9,1),t2 = c('b',NA,'a','c',NA),
            p2 = c(0.02,NA,0.25,0.10,NA), t3 = c(NA,NA,'c',NA,NA),
            p3 = c(NA,NA,0.25,NA,NA))

我希望计算给定行的 t1、t2、t3 列中存在的唯一值的数量,并将此数字放入新变量(总计)中,该变量应具有如下输出:
output <- data.frame(id = c(1,2,3,4,5),t1 = c('a','a','b','b','c'),
            p1 = c(0.98,1,0.5,0.9,1),t2 = c('b',NA,'a','c',NA),
            p2 = c(0.02,NA,0.25,0.10,NA), t3 = c(NA,NA,'c',NA,NA),
            p3 = c(NA,NA,0.25,NA,NA), total = c(1,1,3,2,1))

使用 dplyr,我可以使用以下代码计算 t1、t2 和 t3 中的唯一字符:
output <- dat %>%
 group_by(id) %>%
 mutate(total = n_distinct(c(t1,t2,t3), na.rm = TRUE))

但是,如果分别计算 t1、t2 或 t3 以实现所需的输出,我无法设置 p1、p2 和 p3 必须 >= 0.05 的条件。有没有办法为每一列 t1、t2、t3 设置这个条件?感谢您的帮助。

最佳答案

您可以添加条件,然后对结果求和。

dat %>% 
  group_by(id) %>% 
  mutate_if(is.factor,as.character) %>%  
  mutate(total = sum(p1>=.05*nchar(t1),p2>=.05*nchar(t2),p3>=.05*nchar(t3),na.rm = T))

# A tibble: 5 x 8
# Groups:   id [5]
#     id t1       p1 t2       p2 t3       p3 total
#  <dbl> <chr> <dbl> <chr> <dbl> <chr> <dbl> <int>
#1     1 a      0.98 b      0.02 NA    NA        1
#2     2 a      1    NA    NA    NA    NA        1
#3     3 b      0.5  a      0.25 c      0.25     3
#4     4 b      0.9  c      0.1  NA    NA        2
#5     5 c      1    NA    NA    NA    NA        1

关于r - 使用 dplyr 和 mutate 对多列中的每一列使用单独的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53227014/

相关文章:

r - 在 R 中的大型数据帧上匹配多个条件

python - 将 Python 函数转换为 R 函数

r - 如何使用相同的函数按行比较矩阵列表

python - 使用 R 或 Python 从简单的列表颜色中绘制包含国家/地区的世界地图

r - 在 tibble 中按组引导

r - 使用对应 ID 名称的 3 个阈值条件对数据帧进行子集化

r - 如何将 R 数据转换为 matlab 矩阵

r - 安装 r-base-dev 的问题

r - 使用 lubridate 和 dplyr 过滤特定日期的数据集

r - 基于 R 中的其他列创建列序列