【问题标题】:How to obtain conditioned results from an R dataframe如何从 R 数据框中获取条件结果
【发布时间】:2020-11-30 08:00:19
【问题描述】:

这是我在这里的第一条消息。我正在尝试解决 edX R 课程中的 R 练习,但我陷入了困境。如果有人可以帮助我解决它,那就太好了。以下是给出的数据框和问题:

> students
   height shoesize gender population
1     181       44   male     kuopio
2     160       38 female     kuopio
3     174       42 female     kuopio
4     170       43   male     kuopio
5     172       43   male     kuopio
6     165       39 female     kuopio
7     161       38 female     kuopio
8     167       38 female    tampere
9     164       39 female    tampere
10    166       38 female    tampere
11    162       37 female    tampere
12    158       36 female    tampere
13    175       42   male    tampere
14    181       44   male    tampere
15    180       43   male    tampere
16    177       43   male    tampere
17    173       41   male    tampere

根据上面的数据框,创建两个子集,其中包含身高等于或低于中位数身高的学生(称为 students.short)和身高严格高于中位数身高的学生(称为students.tall)。按人口计算,上述 2 个子集的平均鞋码是多少?

我已经能够创建两个子集 students.tallstudents.short(两者都通过TRUE/FALSE 显示答案),但我没有知道如何通过人口获得平均值。数据应该是这样显示的:

                    kuopio     tampere
students.short      xxxx       xxxx
students.tall       xxxx       xxxx

如果您能帮帮我,非常感谢!

【问题讨论】:

    标签: r edx


    【解决方案1】:

    您可以在tidyr 中使用pivot_wider() 并将参数values_fn 设置为mean

    library(dplyr)
    library(tidyr)
    
    df %>%
      mutate(grp = if_else(height > median(height), "students.tall", "students.short")) %>%
      pivot_wider(id_cols = grp, names_from = population, values_from = height, values_fn = mean)
    
    # # A tibble: 2 x 3
    #   grp            kuopio tampere
    #   <chr>           <dbl>   <dbl>
    # 1 students.tall    176.    177.
    # 2 students.short   164     163.
    

    使用base的方式,你可以试试xtabs(),它返回一个table对象。

    xtabs(height ~ grp + population,
          aggregate(height ~ grp + population, FUN = mean,
                    transform(df, grp = ifelse(height > median(height), "students.tall", "students.short"))))
    
    #                 population
    # grp                kuopio  tampere
    #   students.short 164.0000 163.4000
    #   students.tall  175.6667 177.2000
    

    注意: 要将table 对象转换为data.frame,可以使用as.data.frame.matrix()

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      #Code
      students.short <- students[students$height<=median(students$height),]
      students.tall <- students[students$height>median(students$height),]
      #Mean
      mean(students.short$shoesize)
      mean(students.tall$shoesize)
      

      输出:

      [1] 38.44444
      [1] 42.75
      

      【讨论】:

        【解决方案3】:

        我们可以通过基于median高度的逻辑向量来split

        # // median height
        medHeight <- median(students$height, na.rm = TRUE)
        
        # // split the data into a list of data.frames using the 'medHeight'
        lst1 <- with(students, split(students, height > medHeight))
        

        然后循环遍历list 使用来自base Raggregate

        lapply(lst1, function(dat) aggregate(shoesize ~ population, 
                data = dat, FUN = mean, na.rm = TRUE))
        

        但是,我们不需要创建两个单独的数据集或 list。可以通过将“人口”和使用logical 向量创建的“grp”进行分组来完成

        library(dplyr)
        students %>%
             group_by(grp = height > medHeight, population) %>%
             summarise(shoesize = mean(shoesize))
        

        【讨论】:

        • ¡非常感谢,阿克伦!该代码在与练习建议的表格不同的表格中显示数据,但它帮助我知道了答案。
        • @Kai7 你可以用list2env 包裹lst1 创建两个对象,但我不建议在全局环境中创建多个对象,即names(lst1) &lt;- c('shortdat', 'longdat'); list2env(lst1, .GlobalEnv)
        猜你喜欢
        • 1970-01-01
        • 2017-03-17
        • 2020-06-14
        • 1970-01-01
        • 2014-11-03
        • 2022-10-14
        • 2021-10-03
        • 2021-04-18
        • 1970-01-01
        相关资源
        最近更新 更多