首页 > 解决方案 > 检查表的元素是否与列名相同

问题描述

我有以下数据:

data <- tibble(
  product_01 = c("AB", "AC", NA),
  product_02 = c("AD", NA, "AB"),
  AB = NA,
  AC = NA,
  AD = NA)

现在,我想得到以下小标题:

> data
# A tibble: 3 x 5
  product_01 product_02 AB    AC    AD   
  <chr>      <chr>      <lgl> <lgl> <lgl>
1 AB         AD         TRUE  FALSE TRUE   
2 AC         NA         FALSE TRUE  FALSE   
3 NA         AB         TRUE  FALSE FALSE

即对于一行的每个元素(在以产品开头的列中)检查该元素是否与列的名称相同(在以产品开头的列之后),TRUE如果相同则放置,FALSE否则。有人知道如何在这里进行吗?我尝试了一些代码(主要是lapply),但没有结果。提前致谢

标签: rdplyr

解决方案


您可以使用apply

cols <- names(data)[-(1:2)]
data[cols] <- t(apply(data[1:2], 1, function(x)  cols %in% x))

# product_01 product_02    AB    AC    AD   
#  <chr>      <chr>      <lgl> <lgl> <lgl>
#1 AB         AD         TRUE  FALSE TRUE 
#2 AC         NA         FALSE TRUE  FALSE
#3 NA         AB         TRUE  FALSE FALSE

我认为在一般情况下,我们不会已经创建具有NA值的列。

data <- tibble(
  product_01 = c("AB", "AC", NA),
  product_02 = c("AD", NA, "AB"))

然后我们可以通过以下方式使用dplyrand :tidyr

library(dplyr)
library(tidyr)

data1 <- data %>% mutate(row = row_number())

data1 %>%
  pivot_longer(cols = -row,
               values_drop_na = TRUE) %>%
  mutate(val = TRUE) %>%
  select(-name) %>%
  pivot_wider(names_from = value, values_from = val, values_fill = FALSE) %>%
  left_join(data1, by = 'row')

推荐阅读