Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.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
R从数据帧生成命名列表_R_Apply_Tidyverse_Purrr_Tidyr - Fatal编程技术网

R从数据帧生成命名列表

R从数据帧生成命名列表,r,apply,tidyverse,purrr,tidyr,R,Apply,Tidyverse,Purrr,Tidyr,我有一个条件数据框架: df <- data.frame(Gender=c("Male", "Female", "Other"), AgeCat=c("young", "adult", "old")) df Gender AgeCat 1 Male young 2 Female adult 3 Other old 编辑 我意识到我想展示一个太简单的例子。 我实际上想要得到的是一个数据帧(或一个可以转换为数据帧或矩阵的列表),如下所示: Conditions I

我有一个条件数据框架:

df <- data.frame(Gender=c("Male", "Female", "Other"), AgeCat=c("young", "adult", "old"))
df
  Gender AgeCat
1   Male  young
2 Female  adult
3  Other    old
编辑 我意识到我想展示一个太简单的例子。 我实际上想要得到的是一个数据帧(或一个可以转换为数据帧或矩阵的列表),如下所示:

    Conditions Individuals Mean_Height
1   Male_young           2       129.5
2 Female_adult           3    185.3333
3    Other_old           0           .
编辑2 我一直坚持这种方法,但我不确定它是否非常有效:

df[c("Conditions", "Individuals", "Mean_Height")] <- t(
        mapply(
            function(X, Y, Z){
                sub_df <- subset(X, Gender==Y & AgeCat==Z)
                c(paste(Y, Z, sep="_"), nrow(sub_df), colMeans(sub_df$Height))
            },
            master,
            df$Gender,
            df$AgeCat
        )
    )
df[c(“条件”、“个体”、“平均身高”)]
library(tidyverse)
df%
变异_if(is.factor,as.character)
大师%
变异_if(is.factor,as.character)
连接列表%semi_连接(df),主节点=主节点)
这将产生一个数据帧列表:

$`1`
  Country Gender AgeCat Height
1      US   Male  young    134
2      US   Male  young    125

$`2`
  Country Gender AgeCat Height
1     SPN Female  adult    189
2     MEX Female  adult    176
3     ARG Female  adult    191

$`3`
[1] Country Gender  AgeCat  Height 
<0 rows> (or 0-length row.names)
$`1`
国家性别年龄猫身高
1美国男青年134
2美国男青年125
$`2`
国家性别年龄猫身高
1 SPN成年女性189
2兆欧女性成人176
3 ARG成年女性191
$`3`
[1] 国家性别年龄猫身高
(或长度为0的行名称)

我正在回答您的第一个问题,然后我会考虑您的编辑。我会用一种方式,使用和

df%
完成(AgeCat、嵌套(国家、性别)、填充=列表(高度=NA))%>%
按性别、年龄划分的组百分比>
巢
鸟巢%
过滤器(!is.na(国家))%>%
选择(国家、性别、年龄、身高)
}) %>% 
set_name(,nm=sprintf(“%s_%s”,pre$Gender,pre$AgeCat))
#>$女性(成人)
#>#tibble:3 x 4
#>国家性别年龄猫身高
#>           
#>1 ARG成年女性191
#>2兆欧女性成人176
#>3 SPN成年女性189
#> 
#>$Male_成人
#>#A tibble:2 x 4
#>国家性别年龄猫身高
#>           
#>1名男性成人
#>2名美国成年男性
#> 
#>$Other_成人
#>#tibble:0 x 4
#>#…有4个变量:国家、性别、年龄、身高
#> 
#>$女/岁
#>#tibble:3 x 4
#>国家性别年龄猫身高
#>           
#>1名ARG女性老年人
#>2兆欧女性老年人
#>3 SPN女性老年人
#> 
#>$Male_old
#>#A tibble:2 x 4
#>国家性别年龄猫身高
#>           
#>1男169岁
#>2岁美国男性
#> 
#>$Other_old
#>#tibble:0 x 4
#>#…有4个变量:国家、性别、年龄、身高
#> 
#>$Female_young
#>#tibble:3 x 4
#>国家性别年龄猫身高
#>           
#>1名ARG女性青年
#>2兆欧女性青年
#>3 SPN女青年
#> 
#>$Male_young
#>#tibble:3 x 4
#>国家性别年龄猫身高
#>           
#>1名男青年
#>2美国男青年134
#>3美国男青年125
#> 
#>$Other_young
#>#tibble:0 x 4
#>#…有4个变量:国家、性别、年龄、身高
由(v0.3.0)于2020年2月20日创建

编辑:包含所有问题的新答案

pre%
不稳定(%)%>%
变异(高度=数值(高度))%>%
绑定行(,df)%>%
完成(AgeCat、嵌套(国家、性别)、填充=列表(高度=NA))%>%
按性别、年龄划分的组百分比>
巢
鸟巢%
选择(国家、性别、年龄、身高)
}) %>% 
设置\u名称(,nm=sprintf(“%s\u%s”,前$Gender,前$AgeCat))%>%
绑定行(,.id=“条件”)
计数%
计数(条件,name=“个人”)
DF%>%
分组依据(条件)%>%
过滤器(!is.na(高度))%>%
总结(平均高度=平均高度,na.rm=T))%>%
左联合(,计数)%>%
选择(条件、个体、平均身高)
#>通过=“条件”连接
#>#tibble:3 x 3
#>条件个人平均身高
#>                        
#>1名成年女性3 185。
#>2男2岁169
#>3男吴扬3130。
由(v0.3.0)于2020年2月20日创建

EDIT2:为了显示本例中的个体数量,我对生成的df做了一些细微的更改。由于NA的平均值不存在,因此返回NaN

pre%
不稳定(%)%>%
变异(高度=数值(高度))%>%
绑定行(,df)%>%
完成(AgeCat、嵌套(国家、性别)、填充=列表(高度=NA))%>%
按性别、年龄划分的组百分比>
巢
鸟巢%
选择(国家、性别、年龄、身高)
}) %>% 
设置\u名称(,nm=sprintf(“%s\u%s”,前$Gender,前$AgeCat))%>%
绑定行(,.id=“条件”)
DF%>%
分组依据(条件)%>%
当(为.na(高度)~0时,突变(N=情况_),
真~1))%>%
总结(个体=总和(N),平均身高=平均身高(na.rm=T))
#>#tibble:6 x 3
#>条件个人平均身高
#>                        
#>1名成年女性3 185。
#>2女_老0南
#>3女_young 0楠
#>4男_成人0男
#>5男11岁169
#>6男2 130。

由(v0.3.0)于2020年2月20日创建,您真的想要这个吗

master <- data.frame(Country=c("US", "US", "ENG", "SPN", "MEX", "ARG"), Gender=c("Male", "Male", "Male", "Female", "Female", "Female"), AgeCat=c("young", "young", "old", "adult", "adult", "adult"), Height=c("134", "125", "169", "189", "176", "191"), stringsAsFactors = FALSE)

df <- data.frame(Gender=c("Male", "Female", "Other"), AgeCat=c("young", "adult", "old"), stringsAsFactors = FALSE)

master %>%
    group_by(Gender, AgeCat) %>%
    summarise(mean(as.numeric(Height))) %>%
    full_join(df)
master%
总结(平均值(如数字(高度))%>%
完全联接(df)
导致

  Gender AgeCat `mean(as.numeric(Height))`
  <chr>  <chr>                       <dbl>
1 Female adult                        185.
2 Male   old                          169 
3 Male   young                        130.
4 Other  old                           NA 
Gender AgeCat`平均值(如数字(高度))`
1名成年女性185名。
2男169岁
3男青年130人。
4其他旧NA

你可以使用
合并
你能在编辑时显示你的预期输出吗,那国家就不重要了,对吧?谢谢你的回答。我不确定在哪里可以用你的代码进行一些计算(见我的编辑)。@u31889我添加了另一个答案。让我知道,如果其中一个是你想要的。然后我会删除另一个。谢谢。我认为这几乎是可行的与我的编辑2虽然。谢谢。然而,我需要先掌握子集,然后计算这个子集。
$`1`
  Country Gender AgeCat Height
1      US   Male  young    134
2      US   Male  young    125

$`2`
  Country Gender AgeCat Height
1     SPN Female  adult    189
2     MEX Female  adult    176
3     ARG Female  adult    191

$`3`
[1] Country Gender  AgeCat  Height 
<0 rows> (or 0-length row.names)
master <- data.frame(Country=c("US", "US", "ENG", "SPN", "MEX", "ARG"), Gender=c("Male", "Male", "Male", "Female", "Female", "Female"), AgeCat=c("young", "young", "old", "adult", "adult", "adult"), Height=c("134", "125", "169", "189", "176", "191"), stringsAsFactors = FALSE)

df <- data.frame(Gender=c("Male", "Female", "Other"), AgeCat=c("young", "adult", "old"), stringsAsFactors = FALSE)

master %>%
    group_by(Gender, AgeCat) %>%
    summarise(mean(as.numeric(Height))) %>%
    full_join(df)
  Gender AgeCat `mean(as.numeric(Height))`
  <chr>  <chr>                       <dbl>
1 Female adult                        185.
2 Male   old                          169 
3 Male   young                        130.
4 Other  old                           NA