将数据框转换为方形数据框。

3

假设我有以下数据框:

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
    )

现在,当V1=1时,我希望将V2和V3的值分别加总,其他变量也同样如此。 我想要获得以下数据框 -

   df2 <- tribble(
      ~Var,~V1,~V2,~V3,
      'V1',0,2,1,
      'V2',2,0,1,
      'V3',1,1,0
    )

这里的逻辑是什么?我最初认为它是三列之间相交元素的总和。 - Vlo
尝试用文字解释它。 - Misha
在原始数据框中,必须将V1,V2,V3 = NA吗?为什么不将它们转换为0,使事情更简单呢? - smci
2个回答

2

使用do.callmapply的选项如下:

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

注意:对于输入(1,3)(3,1)的预期输出与问题中提到的值不匹配。也许问题提出者需要验证这两个值。


1
这是一个使用 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   

1
这两种解决方案都可以胜任,我很乐意接受。Dplyr的解决方案比基本R稍微简洁一些,因此我会赞扬它的可读性。 - Misha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接