r - 组别比例表

标签 r

我有一个 data.frame 结构如下:

location               gender        15.19     20.30      31.40      41.64      65.
New York                Female          2         41         13         19        1
New York                  Male          1         23         15         17        2
San Francisco           Female          1         27         14         14        3
San Francisco             Male          4         24         14         10        1
Mexico City             Female          1         40         26         11        3
Mexico City               Male          4         23         35          8        3
Paris                   Female          2         12         10          6        0
Paris                     Male          1         20         13         11        1

...并且需要将它变成一个比例表,其中每个单元格代表它在给定城市的两行中的比例。 This是一种解决方案,但是否有一种更简单的方法可以对多列执行此操作(只需转换它们而不创建新列?)

编辑 正确的输出会将每个单元格作为该城市内所有单元格的比例,以便共享位置“纽约”的所有单元格加起来为 1,共享位置“旧金山”等的所有单元格也是如此,即:

 location             gender        15.19     20.30      31.40      41.64        65.
 New York             Female          .01       .31        .1         .14        .01
 New York               Male          .01       .17       .11         .13        .02

最佳答案

library("data.table")
selected_cols <- colnames(df)[3:7]
setDT(df)[, prop.table(.SD), by = location, .SDcols = selected_cols]

#         location      X15.19    X20.30     X31.40     X41.64        X65.
# 1:      New York 0.014925373 0.3059701 0.09701493 0.14179104 0.007462687
# 2:      New York 0.007462687 0.1716418 0.11194030 0.12686567 0.014925373
# 3: San Francisco 0.008928571 0.2410714 0.12500000 0.12500000 0.026785714
# 4: San Francisco 0.035714286 0.2142857 0.12500000 0.08928571 0.008928571
# 5:   Mexico City 0.006493506 0.2597403 0.16883117 0.07142857 0.019480519
# 6:   Mexico City 0.025974026 0.1493506 0.22727273 0.05194805 0.019480519
# 7:         Paris 0.026315789 0.1578947 0.13157895 0.07894737 0.000000000
# 8:         Paris 0.013157895 0.2631579 0.17105263 0.14473684 0.013157895

验证结果:每个城市总和是否为1

a1 <- setDT(df)[, prop.table(.SD), by = location, .SDcols = selected_cols]
sum(subset(a1, location == "New York", select = selected_cols))
# [1] 1

然后性别列可以结合a1

do.call(cbind, list(gender = df$gender, a1))

数据:

dput(df)
structure(list(location = c("New York", "New York", "San Francisco", 
"San Francisco", "Mexico City", "Mexico City", "Paris", "Paris"
), gender = c("Female", "Male", "Female", "Male", "Female", "Male", 
"Female", "Male"), X15.19 = c(2L, 1L, 1L, 4L, 1L, 4L, 2L, 1L), 
    X20.30 = c(41L, 23L, 27L, 24L, 40L, 23L, 12L, 20L), X31.40 = c(13L, 
    15L, 14L, 14L, 26L, 35L, 10L, 13L), X41.64 = c(19L, 17L, 
    14L, 10L, 11L, 8L, 6L, 11L), X65. = c(1L, 2L, 3L, 1L, 3L, 
    3L, 0L, 1L)), .Names = c("location", "gender", "X15.19", 
"X20.30", "X31.40", "X41.64", "X65."), row.names = c(NA, -8L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x0000000000200788>)

编辑: 根据@Sumedh 在下面评论中的建议,性别列不会删除,所有 selected_cols 必须是 double 类型。这是因为 prop.table 中的比例属于 double 类型。否则,当对 selected_cols 执行引用赋值 := 时,将出现 RHS = LHS 数据类型强制转换错误

setDT(df)[, (selected_cols) := prop.table(.SD), by = location, .SDcols = selected_cols]

关于r - 组别比例表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38778447/

相关文章:

r - 使用 dplyr 在行和列表上映射一个简单的计算

r - 如何在 R 中对数字进行分类?

r - 将(df 的)每一列的唯一值存储在列表中

r - 通过对另一个矩阵的行求和在 R 中创建新矩阵

跨嵌套列表的 rbind 数据帧

r - "select A, B, max(C) from D group by C"的 dplyr 习语

按组滚动/移动平均

r - 在 R 中使用神经网络包时如何实现自己的错误函数?

r - 如何用不同颜色为图例的 2 个表达式着色?

r - 如何引用循环 R 中列的位置