【问题标题】:summarizing the proportion of records in each row of dataframe总结每行数据帧中记录的比例
【发布时间】:2018-04-24 23:21:27
【问题描述】:

我有大型数据框,其中一些列只有“NA”值。我想用百分比来总结每一行。
比方说:df

user col1 col2 col3 col4 col5 col6
 100   1    1    2   2    1    NA
 200   1    2    3   3    NA   NA
 300   2    3    3   3    2    NA

我想根据总成员的百分比汇总user 行。
例如,user:100 有 3/5 的事件 1 和 2/5 的事件 2。

summarized_df:

user event1 event2 event3
100    3/5   2/5    0
200    1/4   1/4    2/4
300    0     2/5    3/5

为每个事件使用百分比也很有用。
我如何在 R 中做到这一点?

【问题讨论】:

    标签: r row summary


    【解决方案1】:

    这是带有applytableprop.table 的基本R 方法。

    cbind(dat[1],
          prop.table(t(apply(dat[-1], 1,
                       function(x) table(factor(x, levels=1:3)))), 1))
    

    需要factor 以确保应用于每一行的table 的输出返回每个潜在元素(1:3),即使没有观察到一个或多个级别。在这里,apply 遍历所有行,并返回每个事件的计数,包括事件未发生时的 0。因为每次调用的输出长度相同,apply 返回一个矩阵。我们转置矩阵并使用prop.table 来计算每一行中每个事件的比例。最后,cbind 将第一列与此矩阵相结合,返回具有所需输出的 ​​data.frame。

    返回

      user    1    2   3
    1  100 0.60 0.40 0.0
    2  200 0.25 0.25 0.5
    3  300 0.00 0.40 0.6
    

    数据

    dat <- 
    structure(list(user = c(100L, 200L, 300L), col1 = c(1L, 1L, 2L
    ), col2 = 1:3, col3 = c(2L, 3L, 3L), col4 = c(2L, 3L, 3L), col5 = c(1L, 
    NA, 2L), col6 = c(NA, NA, NA)), .Names = c("user", "col1", "col2", 
    "col3", "col4", "col5", "col6"), class = "data.frame", row.names = c(NA,-3L))
    

    【讨论】:

    • dat[1] 返回一个由第一列组成的 data.frame。 dat[-1] 返回一个由除第一列之外的所有列组成的data.frame。
    • 我怎样才能给它列名(或名称)而不是索引?例如而不是dat[c(-1,-5)]就像data[-c("user_id","grades")]。(最后一个代码不起作用)
    • 你的问题不清楚。您可以使用names(dat) &lt;- c(...) 指定名称。您可以直接使用名称进行索引,因为您注意到 dat["user"] 而不是 dat[1]。如果你想根据名字删除,你必须做一些聪明的事情,比如dat[setdiff(names(dat), "user")],它会删除第一列或dat[-grep("user", names(dat))],它会做同样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多