有些类型的调查软件会以以下不方便的方式处理" Select 所有适用的"问题.假设有一个问题问"你养的是什么类型的宠物? Select 所有适用的:狗、cat 、雪貂、蛇."生成的数据集如下所示:

pet_tab <- tibble(
  owner = 1:5,
  pet_1 = c("dog", "cat", "ferret", "dog", "snake"),
  pet_2 = c("cat", "ferret", NA, "ferret", NA),
  pet_3 = c("ferret", NA, NA, "snake", NA),
  pet_4 = c("snake", NA, NA, NA, NA)
  )

  owner pet_1  pet_2  pet_3  pet_4
   1    dog    cat    ferret snake
   2    cat    ferret NA     NA   
   3    ferret NA     NA     NA   
   4    dog    ferret snake  NA   
   5    snake  NA     NA     NA  

这是很难处理的.组织这些数据的一种更好的方法是这样的:

  owner  dog   cat ferret snake
     1     1     1      1     1
     2     0     1      1     0
     3     0     0      1     0
     4     1     0      1     1
     5     0     0      0     1

其中每一列指示主人是否拥有给定类型的动物.如何将第一种类型的数据转换为第二种类型?我知道有很多方法可以做到这一点,但我想要一种优雅、简洁并且最好使用tidyVerse的方法,尽管data.table也可以.

推荐答案

我们可以reshape 为‘Long’格式,在‘Pet’列上为pivot_longer,然后reshape 为宽度为pivot_wider,values_fnlength,values_fill为0

library(dplyr)
library(tidyr)
pet_tab  %>%
   pivot_longer(cols = starts_with('pet'), values_drop_na = TRUE) %>% 
   pivot_wider(names_from = value, values_from = name,
      values_fn = ~ +(length(.x) > 0), values_fill = 0)

-输出

# A tibble: 5 × 5
  owner   dog   cat ferret snake
  <int> <int> <int>  <int> <int>
1     1     1     1      1     1
2     2     0     1      1     0
3     3     0     0      1     0
4     4     1     0      1     1
5     5     0     0      0     1

或在base Rtable之间

+(table(pet_tab$owner[row(pet_tab[-1])], unlist(pet_tab[-1])) > 0)
   
    cat dog ferret snake
  1   1   1      1     1
  2   1   0      1     0
  3   0   0      1     0
  4   0   1      1     1
  5   0   0      0     1

R相关问答推荐

使用gggplot 2在R中重新调整面板和y轴文本大小

使用预定值列表将模拟数量(n)替换为rnorm()

ggplot 2中的地块底图(basemaps_gglayer()不起作用)

筛选出以特定顺序患病的个体

如何改变时间图R中的悬停信息?

在ggplot中为不同几何体使用不同的 colored颜色 比例

如何在R库GoogleDrive中完全删除预先授权的Google帐户?

使用Scale_*_MANUAL时在图例中保留未使用的系数级别

汇总数据的Sheffe检验的P值(平均值和标准差)

如何将一列中的值拆分到R中各自的列中

为R中的16组参数生成10000个样本的有效方法是什么?

名字的模糊匹配

使用函数从R中的列中删除标高

抽样变换-REXP与RWEIBUR

如果满足条件,则替换列的前一个值和后续值

如何修改GT表中组名行的 colored颜色 ?

通过匹配另一个表(查找表)中的列值来填充数据表,并在另一个变量上进行内插

将日期列从字符转换为日期得到的结果是NAS

Package emMeans:如果emmip模型中包含的变量较少,emMeans模型中的其他变量设置为什么?

R中刻面网格中的排序条形图