重塑dataframe,使匹配的族成员拥有自己的列
我有一个数据帧重塑dataframe,使匹配的族成员拥有自己的列,r,tidyverse,data-wrangling,R,Tidyverse,Data Wrangling,我有一个数据帧 df <- tibble( id = 1:5, family = c("a","a","b","b","c"), twin = c(1,2,1,2,1), datacol1 = 11:15, datacol2 = 21:25 ) df 基尔 cols = c("datacol1", "datacol2") do.call(rbind, lapply(split(df, df$family), function(x){ cbind(x
df <- tibble(
id = 1:5,
family = c("a","a","b","b","c"),
twin = c(1,2,1,2,1),
datacol1 = 11:15,
datacol2 = 21:25
)
df
基尔
cols = c("datacol1", "datacol2")
do.call(rbind, lapply(split(df, df$family), function(x){
cbind(x, setNames(lapply(x[cols], function(y) {
if (length(y) == 2) {
rev(y)
} else {
NA
}}),
paste0(cols, ".b")))
}))
基尔
cols = c("datacol1", "datacol2")
do.call(rbind, lapply(split(df, df$family), function(x){
cbind(x, setNames(lapply(x[cols], function(y) {
if (length(y) == 2) {
rev(y)
} else {
NA
}}),
paste0(cols, ".b")))
}))
我们也可以在
library(dplyr)
df %>%
group_by(family) %>%
mutate_at(vars(starts_with('datacol')), list(`2` =
~if(n() == 1) NA_integer_ else rev(.)))
# A tibble: 5 x 7
# Groups: family [3]
# id family twin datacol1 datacol2 datacol1_2 datacol2_2
# <int> <chr> <dbl> <int> <int> <int> <int>
#1 1 a 1 11 21 12 22
#2 2 a 2 12 22 11 21
#3 3 b 1 13 23 14 24
#4 4 b 2 14 24 13 23
#5 5 c 1 15 25 NA NA
库(dplyr)
df%>%
组别(家庭)%>%
在(vars(以('datacol')开头)、list('2`=
~if(n()==1)NA_integer_else rev(.))
#一个tibble:5x7
#组别:家庭[3]
#id系列双胞胎datacol1 datacol2 datacol1_2 datacol2_2
#
#111121222
#2 a 2 12 22 11 21
#3 3 b 1 13 23 14 24
#4 4 b 2 14 24 13 23
#5 5 c 1 15 25 NA NA
我们也可以在
library(dplyr)
df %>%
group_by(family) %>%
mutate_at(vars(starts_with('datacol')), list(`2` =
~if(n() == 1) NA_integer_ else rev(.)))
# A tibble: 5 x 7
# Groups: family [3]
# id family twin datacol1 datacol2 datacol1_2 datacol2_2
# <int> <chr> <dbl> <int> <int> <int> <int>
#1 1 a 1 11 21 12 22
#2 2 a 2 12 22 11 21
#3 3 b 1 13 23 14 24
#4 4 b 2 14 24 13 23
#5 5 c 1 15 25 NA NA
库(dplyr)
df%>%
组别(家庭)%>%
在(vars(以('datacol')开头)、list('2`=
~if(n()==1)NA_integer_else rev(.))
#一个tibble:5x7
#组别:家庭[3]
#id系列双胞胎datacol1 datacol2 datacol1_2 datacol2_2
#
#111121222
#2 a 2 12 22 11 21
#3 3 b 1 13 23 14 24
#4 4 b 2 14 24 13 23
#5 5 c 1 15 25 NA NA
我昨晚也在用同样的方法。但我想不出那部分。你偶尔会遇到这种情况吗?@jazzurro在这种情况下,当一个组的行数为1时,OP希望它为NA。但是,在某些情况下,您需要按组获取值的总和,如果所有值都是NA,并且如果我们使用NA.rm=TRUE,则返回0。如果OP希望它是NA
,那么我们就做If(all(is.NA(.))NA_real_usem sum(,NA.rm=TRUE)
我昨晚在用同样的方法。但我想不出那部分。你偶尔会遇到这种情况吗?@jazzurro在这种情况下,当一个组的行数为1时,OP希望它为NA。但是,在某些情况下,您需要按组获取值的总和,如果所有值都是NA,并且如果我们使用NA.rm=TRUE,则返回0。如果OP希望它是NA
,那么我们就做If(all(is.NA(.))NA\u real\u else sum(,NA.rm=TRUE)