R 将数据帧转换为方形数据帧
假设我有以下df: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
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