Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重塑dataframe,使匹配的族成员拥有自己的列_R_Tidyverse_Data Wrangling - Fatal编程技术网

重塑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)