【问题标题】:Total rows and divide by columns of all tables in a list object?列表对象中所有表的总行数并除以列?
【发布时间】:2021-12-09 02:10:43
【问题描述】:

我有一个列表对象,其中包含多个表,其中包含年份列和特定单词的频率。每个表格的尺寸可能略有不同,具体取决于年份范围和使用的词语。

Year word1 word2 word3
2009 1 5 4
2010 2 3 5

我想创建一个表格,对每一行(不包括年份)求和,然后将列值除以行总和,以便生成如下表格:

Year word1 word2 word3
2009 0.1 0.5 0.4
2010 0.2 0.3 0.5

有没有办法对列表对象执行此操作? TIA

【问题讨论】:

    标签: r list datatable


    【解决方案1】:

    这行得通吗:

    cbind(df[1], t(apply(df[-1], 1, function(x) x/sum(x))))
      Year word1 word2 word3
    1 2009   0.1   0.5   0.4
    2 2010   0.2   0.3   0.5
    

    如果您有此类数据框的列表:

    mylist <- list(df, df)
    mylist
    [[1]]
      Year word1 word2 word3
    1 2009     1     5     4
    2 2010     2     3     5
    
    [[2]]
      Year word1 word2 word3
    1 2009     1     5     4
    2 2010     2     3     5
    
    lapply(mylist, function(y) cbind(y[1], t(apply(y[-1], 1, function(x) x/sum(x)))))
    [[1]]
      Year word1 word2 word3
    1 2009   0.1   0.5   0.4
    2 2010   0.2   0.3   0.5
    
    [[2]]
      Year word1 word2 word3
    1 2009   0.1   0.5   0.4
    2 2010   0.2   0.3   0.5
    

    使用的数据:

    df
      Year word1 word2 word3
    1 2009     1     5     4
    2 2010     2     3     5
    

    【讨论】:

    • lapply 脚本有效!谢谢!使用相同的数据格式,有没有办法设置小数位数?目前,它给出的值是 0.1134922?
    • 并用句点或连字符替换新表中的 0 值?由于某些行/列的频率为 0,因此得到的 0 比预期多得多。
    • 只需插入对round(x/sum(x))的呼叫。
    • @Jonas 谢谢!我在 R 方面仍然很差。你能说明如何为此“插入呼叫”吗?
    • 如果您想四舍五入到 2 位,请使用 cbind(df[1], t(apply(df[-1], 1, function(x) round(x/sum(x),2))) 而不是 cbind(df[1], t(apply(df[-1], 1, function(x) x/sum(x))))
    【解决方案2】:

    对于单个data.frame,可以使用如下函数:

    doit <- function(df) {
      cbind(df[1],sweep(df[-1],1,rowSums(df[-1]),"/"))
    }
    

    例如

    df <- data.frame(Year = 1:3, Word1 = c(1,2,3), Word2 = c(3,2,1), Word3 = c(6,6,6))
    doit(df)
    #  Year Word1 Word2 Word3
    #1    1   0.1   0.3   0.6
    #2    2   0.2   0.2   0.6
    #3    3   0.3   0.1   0.6
    

    如果列表中有多个 data.frame,只需使用 lapply 包装所有内容,例如 lapply(dfList,doit)

    【讨论】:

      猜你喜欢
      • 2013-01-06
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      • 2019-12-21
      • 2022-12-31
      • 1970-01-01
      • 2015-07-23
      相关资源
      最近更新 更多