我有一个数据框df.

ID  001-alpha   001-sigma   001-delta   001-gamma   002-alpha   002-beta    002-charlie 002-delta
12  1           2           3           3           2               NA          2               0
21  NA          1           3           NA          3               2           2               NA
24  1           2           NA          3           3               1           3               2
36  NA          2           3           4           2               2           NA              1
44  NA          1           2           3           1               2           1               2
57  0           NA          2           3           1               1           3               1

在这df篇文章中,我有几个专栏:

  1. ID字段表示产品ID,该ID是唯一的

  2. 001-002-开头的列名表示这些产品的一些规格

Requirement

我感兴趣的是判断每对产品规范,有多少ID是通用的,即它们包含非null或非NA值.

为了进一步解释,如果我以first two columns(001-alpha001-sigma)为例.这里,ID=12和ID=24在这些列之间是公共的或非空的.对于其余ID,其中一列中缺少值.因此,我所需的输出列001-alpha-sigma的值为2.

类似地,对于firstthird列(001-alpha001-delta),同样只有两个公共ID(即ID=12和ID=57)在这两列中包含非空值.因此,输出列001-alpha-delta将包含2.

我需要的输出如下:

001-alpha-sigma 001-alpha-delta 001-alpha-gamma 001-sigma-delta 001-sigma-gamma 001-delta-gamma 002-alpha-beta  002-alpha-charlie   002-alpha-delta 002-beta-charlie    002-beta-delta  002-charlie-delta
2               2               3               4               4               4               5               5                   5               4                   4               4

有没有一种简单的方法来提取这些信息?e、 g.,我们可以使用dplyr吗?

我看过其他几个帖子,但它们不符合我的要求.例如

Sum columns by group (row names) in a matrix

为了方便起见,我还分享了下面的dput(df)条.

structure(list
(ID = structure(1:6, .Label = c("12", "21", "24", "36", "44", "57"), 
class = "factor"), 
`001.alpha` = c(1L, NA, 1L, NA, NA, 0L), 
`001.sigma` = c(2L, 1L, 2L, 2L, 1L, NA), 
`001.delta` = c(3L, 3L, NA, 3L, 2L, 2L), 
`001.gamma` = c(3L, NA, 3L, 4L, 3L, 3L), 
`002.alpha` = c(2L, 3L, 3L, 2L, 1L, 1L), 
`002.beta` = c(NA,2L, 1L, 2L, 2L, 1L), 
`002.charlie` = c(2L, 2L, 3L, NA, 1L,3L), 
`002.delta` = c(0L, NA, 2L, 1L, 2L, 1L)), 
row.names = c(NA, -6L), class = "data.frame")

谢谢你的帮助!

推荐答案

这个问题涉及一些基于两个列名的所有对的简单整洁的 Select 工作.我首先创建数据帧的一个子集和二个子集.然后在main函数中,我从创建一个数据帧开始,该数据帧包含输入中两个名称的所有可能组合.我变异以创建一列选定的原始数据,使其仅包含指定行的两列,然后删除_na并计算每个子集数据帧的行数.该过程通过一些名称操作和旋转完成.

如果可行,请告诉我:

library(tidyverse)
df <- structure(list(ID = structure(1:6, .Label = c("12", "21", "24", "36", "44", "57"), 
class = "factor"), 
`001.a.alpha` = c(1L, NA, 1L, NA, NA, 0L), `001.b.sigma` = c(2L, 1L, 2L, 2L, 1L, NA), `001.c.delta` = c(3L, 3L, NA, 3L, 2L, 2L), `001.e.gamma` = c(3L, NA, 3L, 4L, 3L, 3L), `002.ff.alpha` = c(2L, 3L, 3L, 2L, 1L, 1L), `002.ef.beta` = c(NA,2L, 1L, 2L, 2L, 1L), `002.gh.charlie` = c(2L, 2L, 3L, NA, 1L,3L), `002.vv.delta` = c(0L, NA, 2L, 1L, 2L, 1L)), row.names = c(NA, -6L), class = "data.frame") %>%
  as_tibble()

ones <- select(df, contains("001"))
twos <- select(df, contains("002"))

main <- function(tib, df) {
  t(combn(colnames(tib), 2)) %>%
    as_tibble(.name_repair = ~c("first_var", "second_var")) %>%
    rowwise() %>%
    mutate(contains_both = list(select(df, all_of(c(first_var, second_var)))),
           result = nrow(drop_na(contains_both)),
           combined_name = (str_c(str_extract(first_var, "^\\d+"),
                                  str_extract(first_var, "[:alpha:]+$"),
                                  str_extract(second_var, "[:alpha:]+$"),
                                  sep = "-"))) %>%
    select(combined_name, result) %>%
    pivot_wider(names_from = combined_name, values_from = result)
}
bind_cols(
  main(ones, df),
  main(twos, df))

R相关问答推荐

NA仅省略具有NA的 Select 行

如何将Rmarkdown中包含图像和文本的行的两个单元格与.PDF输出垂直对齐?

是否有R函数来判断一个组中的所有值是否与另一个组中的所有值相同?

如何在ggplot 2 geom_segment图表中将UTC转换为EET?

如何使用geom_sf在边界显示两种 colored颜色 ?

R创建一个数据透视表,计算多个组的百分比

抖动点与嵌套类别变量箱形图的位置不对齐

过滤器数据.基于两列的帧行和R中的外部向量

在特定Quarto(reveal.js)幻灯片上隐藏徽标

如何使下一个按钮只出现在Rshiny 的一段时间后?""

R函数‘paste`正在颠倒其参数的顺序

使用外部文件分配变量名及其值

多个模拟序列间的一种预测回归关系

线性模型斜率在减少原始数据时提供NA

使用范围和单个数字将数字与字符串进行比较

有没有办法使用ggText,<;Sub>;&;<;sup>;将上标和下标添加到同一元素?

基于数据集属性将科分配给物种

根据约束随机填充向量的元素

为什么在写入CSV文件时Purrr::Pwalk不起作用

我正在try 创建一个接近cos(X)的值的While循环,以便它在-或+1-E10范围内