R 将数据帧转换为方形数据帧

R 将数据帧转换为方形数据帧,r,R,假设我有以下df: library (tidyverse) df <- tribble( ~ID, ~V1, ~V2,~V3, '1', NA,1, NA, '2', 1,1,NA, '3', 1,NA,NA, '4', NA,NA,1, '5', 1,1,1, '6',NA,NA,1, '7',1,NA,1 ) 库(tidyverse) df使用do.call

假设我有以下df:

library (tidyverse)
    df <- tribble(
      ~ID, ~V1, ~V2,~V3,
      '1',   NA,1, NA,
      '2',   1,1,NA,
      '3',   1,NA,NA,
      '4',   NA,NA,1,
      '5', 1,1,1,
      '6',NA,NA,1,
      '7',1,NA,1
    )
库(tidyverse)

df使用
do.call
mapply
的选项如下:

do.call(rbind, mapply(function(x){
  v <- colSums(df[!is.na(df[,x]) & df[,x]==1,-1], na.rm = TRUE)
  v[x-1] <- 0
  v
}, 2:4, SIMPLIFY = FALSE))

#      V1 V2 V3
# [1,]  0  2  2
# [2,]  2  0  1
# [3,]  2  1  0
do.call(rbind,mapply)(函数(x){

v这里有一个带有
tidyverse

library(tidyverse)
nm1 <- names(df)[-1]
set_names(nm1, nm1) %>% 
    map_df(~ df %>% 
    filter(!!rlang::sym(.x)==1) %>% 
    select(-ID) %>% 
    summarise_all(sum, na.rm = TRUE) %>% 
    mutate(!! .x := 0), .id = 'Var')
# A tibble: 3 x 4
#  Var      V1    V2    V3
#   <chr> <dbl> <dbl> <dbl>
#1 V1     0     2.00  2.00
#2 V2     2.00  0     1.00
#3 V3     2.00  1.00  0   
库(tidyverse)
nm1%
map_df(~df%>%
过滤器(!!rlang::sym(.x)==1)%>%
选择(-ID)%%>%
汇总所有数据(总和,na.rm=TRUE)%>%
mutate(!!.x:=0),.id='Var')
#一个tibble:3x4
#Var V1 V2 V3
#      
#1 v10 2.00 2.00
#2 V2 2.00 0 1.00
#3 V3 2.00 1.00 0

这里的逻辑是什么?我最初认为它是三列之间相交元素的总和。试图用文字来解释它。您必须在原始数据帧中有
V1,V2.V3=NA
?为什么不将它们转换为0,使事情变得更简单?两种解决方案都很有效,我很乐意接受这两种解决方案。Dplyr解决方案稍微简单一些没有基本R那么简洁,所以我要赞扬它的合法性。
library(tidyverse)
nm1 <- names(df)[-1]
set_names(nm1, nm1) %>% 
    map_df(~ df %>% 
    filter(!!rlang::sym(.x)==1) %>% 
    select(-ID) %>% 
    summarise_all(sum, na.rm = TRUE) %>% 
    mutate(!! .x := 0), .id = 'Var')
# A tibble: 3 x 4
#  Var      V1    V2    V3
#   <chr> <dbl> <dbl> <dbl>
#1 V1     0     2.00  2.00
#2 V2     2.00  0     1.00
#3 V3     2.00  1.00  0