【问题标题】:How to loop with two lists in R如何在 R 中循环使用两个列表
【发布时间】:2020-12-07 11:48:32
【问题描述】:

我有一个包含人口统计信息和问题的数据集。

DF<-(Participant = c(1,2,3,4,5,6,7,8,9,10)
Male = c(1,0,1,1,0,1,0,0,1,0)
Female = c(0,1,0,0,1,0,1,1,0,1)
Q1 = c(9,6,5,4,5,1,3,5,5,2)
Q2 = c(2,4,5,4,2,1,3,5,4,2)
Q3 = c(6,8,2,7,5,2,1,1,6,3))

我有两个列表(由列标题组成),一个是人口统计信息(男性、女性、年龄组等),另一个是带有相关回答的问题。

Demographic <- c(“Male”, “Female”, “Age_group_1”, “Age_group_2”…)
Questions<- c(“Q1”, “Q2”, Q3”, “Q4”…)

我需要一些类似的东西——如果人口统计列中的值等于 1,那么将所有单独问题列中的分数相加。但我想这样做是一个循环,所以我对人口统计列表(~80)中的所有列都有单独的问题分数(~300)。另外我想保存输出。我不知道该怎么做,而且我自己也陷入了糟糕的编程循环!

最终结果应如下所示:

   M  F
Q1 20 21
Q2 16 16
Q3 23 18

如果有任何帮助,我将不胜感激!

提前致谢。

更新:

在朋友的帮助下,我找到了解决问题的方法。但是,您如何提高效率?

df.list <- list()
for(question in questions){
  question.df <- (DF[, lapply(.SD,sum, na.rm=T), by=question, 
.SDcols=c(demographic)])
  df.list <- append(df.list, question.df)}

list_new <- bind_cols(df.list, .id = "column_label")

【问题讨论】:

  • 第一段代码运行不正常。也许您的意思是:` DF

标签: r list loops nested


【解决方案1】:
library(tidyr)
library(dplyr)

df <- data.frame(
    Participant = c(1,2,3,4,5,6,7,8,9,10),
     Male = c(1,0,1,1,0,1,0,0,1,0),
     Female = c(0,1,0,0,1,0,1,1,0,1),
     Q1 = c(9,6,5,4,5,1,3,5,5,2),
     Q2 = c(2,4,5,4,2,1,3,5,4,2),
     Q3 = c(6,8,2,7,5,2,1,1,6,3)
)

df %>% 
  mutate(sex = ifelse(Male == 1, "M", "F")) %>%
  select(-Male, -Female) %>%
  pivot_longer(cols = starts_with("Q"), names_to = "Q") %>%
  group_by(sex, Q) %>%
  summarise(value = sum(value)) %>%
  pivot_wider(names_from = sex)

给予:

  Q         F     M
  <chr> <dbl> <dbl>
1 Q1       21    24
2 Q2       16    16
3 Q3       18    23

【讨论】:

    【解决方案2】:

    根据您要对输出执行的操作,另一种方法是使用 tables::tabular(),它可用于生成其他统计信息(例如百分比),以及自定义行和列标题。

    我们将使用问题中提供的数据生成一个简单的表格。

    df <- data.frame(Participant = c(1,2,3,4,5,6,7,8,9,10),
         Male = c(1,0,1,1,0,1,0,0,1,0),
         Female = c(0,1,0,0,1,0,1,1,0,1),
         Q1 = c(9,6,5,4,5,1,3,5,5,2),
         Q2 = c(2,4,5,4,2,1,3,5,4,2),
         Q3 = c(6,8,2,7,5,2,1,1,6,3))
    df$sex <- ifelse(df$Male == 1,"M","F")
    library(tables)
    tabular((Q1 + Q2 + Q3)~Factor(sex)*(sum),data=df)
    

    ...和输出:

    > tabular((Q1 + Q2 + Q3)~Factor(sex)*(sum),data=df)
               
        sex    
        F   M  
        sum sum
     Q1 21  24 
     Q2 16  16 
     Q3 18  23 
    

    处理多个人口统计变量

    在我回答的 cmets 中,有人问了一个关于如何将 tabular() 与多个人口统计变量一起使用的问题。

    我们可以使用lapply()paste()substitute() 的组合来为`tabular() 构建正确的公式表达式。

    为了说明这个过程,我们将在上面列出的数据框中添加第二个人口统计变量Income。然后我们创建一个向量来表示我们将为其生成表格的人口统计变量列表。最后,我们使用带有lapply() 的向量来生成表格。

    df <- data.frame(Participant = c(1,2,3,4,5,6,7,8,9,10),
         Male = c(1,0,1,1,0,1,0,0,1,0),
         Female = c(0,1,0,0,1,0,1,1,0,1),
         Income = c(rep("low",5),rep("high",5)),
         Q1 = c(9,6,5,4,5,1,3,5,5,2),
         Q2 = c(2,4,5,4,2,1,3,5,4,2),
         Q3 = c(6,8,2,7,5,2,1,1,6,3))
    df$Sex <- ifelse(df$Male == 1,"M","F")
    library(tables)
    tabular((Q1 + Q2 + Q3)~Factor(Sex)*(sum),data=df)
    
    demoVars <- c("Sex","Income")
    
    lapply(demoVars,function(x){
            # generate a formula expression including the column variable
            # and use substitute() to render it correctly within tabular() 
            theExpr <- paste0("(Q1 + Q2 + Q3) ~ Factor(",x,")*(sum)")
            tabular(substitute(theExpr),data=df)
    }) 
    

    ...和输出:

    > lapply(demoVars,function(x){
    +         # generate a formula expression including the column variable
    +         # and use substitute() to render it correctly within tabular() 
    +         theExpr <- paste0("(Q1 + Q2 + Q3) ~ Factor(",x,")*(sum)")
    +         tabular(substitute(theExpr),data=df)
    + })
    [[1]]
               
        Sex    
        F   M  
        sum sum
     Q1 21  24 
     Q2 16  16 
     Q3 18  23 
    
    [[2]]
                  
        Income    
        high   low
        sum    sum
     Q1 16     29 
     Q2 15     17 
     Q3 13     28 
    

    请注意,我们可以通过将表格保存到输出对象并根据需要以打印机友好的格式呈现它们来进一步增强解决方案。

    【讨论】:

    • 这真的很有用,但我如何遍历包含 80 个人口统计变量的列表?
    • @lightsout - 我们可以使用lapply() 生成一组表格,每个人口统计变量都有一个表格。我将在接下来的 24 小时左右发布更新说明如何做到这一点。
    • 谢谢伦!这将是非常有用的,你无法相信。
    • @lightsout - 正如承诺的那样,我添加了代码来说明如何使用tabular() 生成具有各种人口统计变量的多个表格。
    • 你乐(n)gend!谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多