【问题标题】:R data.frame operationR 数据帧操作
【发布时间】:2013-10-09 14:50:07
【问题描述】:

我有一个包含约 1 百万行和 8 个列(变量)的大型数据集。其中一个变量 ORDER 的类别从 1 到 90。我想创建一个新的 data.frame,减少变量 ORDER (4) 1、2、3+ 和 ALL 的类别,其中 ALL 是总和所有类别 (1-90) 和 3+ 的 FREQUENCY 是类别 >=3 的 FREQUENCY 的总和(所以 3 到 90)。

YEAR  PROVINCE  ZONA91OK AGE5 ORDER NATIONALITY_MOTHER NATIONALITY_FATHER FREQUENCY
 1979        1      101   15     1      No computable      No computable        10
 1989        3      102   20     1      No computable      No computable        50

我是 R 数据管理方面的新手,因此非常感谢您对这个问题的任何帮助!

这是data.frame的示例

mydata<-structure(list(YEAR = c(1981, 1981, 1981, 1981, 1981, 1981, 1981, 
1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 
1981, 1981, 1981), PROVINCE = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), ZONA91OK = c(101, 101, 101, 
101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 
101, 101, 101, 101, 101), AGE5 = c(15, 20, 20, 25, 25, 25, 25, 
30, 30, 30, 30, 30, 35, 35, 35, 35, 35, 35, 40, 40, 40), ORDER = c(1, 
1, 2, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 12, 1, 3, 5), 
NATIONALITY_MOTHER = structure(c(9L, 9L, 9L, 9L, 9L, 9L, 
9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L
), .Label = c("España", "UE-15 y PD", "Resto Europa", "Magreb", 
"África Sub-sahariana", "Latinoamérica", "Asia", "Resto del Mundo", 
"No computable"), class = "factor"), NATIONALITY_FATHER = structure(c(9L, 
9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 
9L, 9L, 9L, 9L, 9L), .Label = c("España", "UE-15 y PD", "Resto Europa", 
"Magreb", "África Sub-sahariana", "Latinoamérica", "Asia", 
"Resto del Mundo", "No computable"), class = "factor"), FREQUENCY = c(10, 
40, 20, 50, 30, 10, 1, 10, 15, 10, 1, 1, 5, 5, 5, 1, 1, 1, 
1, 1, 1)), .Names = c("YEAR", "PROVINCE", "ZONA91OK", "AGE5", 
"ORDER", "NATIONALITY_MOTHER", "NATIONALITY_FATHER", "FREQUENCY"
 ), row.names = 60175:60195, class = "data.frame")

【问题讨论】:

    标签: r dataframe data-management


    【解决方案1】:

    如果您的数据有 1M 行,您可能会想要使用 data.table

    library(data.table)
    myDT <- data.table(mydata, key="ORDER")
    
    specialCats <- c(1, 2, 3)
    
    rbind(
        myDT[, list(SUM_FOR="ALL", FREQ_SUM=sum(FREQUENCY))]
      , myDT[!.(specialCats), list(SUM_FOR="3+", FREQ_SUM=sum(FREQUENCY))]
    )
    
    ## RESULTS: 
           SUM_FOR FREQ_SUM
    1:     ALL      219
    2:      3+        7
    

    更新回复:评论

    要将ORDER 列更改为您的要求,请使用:

    myDT[, order := ifelse(ORDER %in% specialCats, as.character(ORDER), "3+")]
    

    注意1:为了让3+成为一个值,你需要转换成字符串。
    注意 2:为"ALL" 添加一行没有多大意义,因为您会为AGEPROVINCE 等添加什么?

    【讨论】:

    • 如果我理解正确,specialCats 用于从 ALL 总和中排除 ORDER 值 1 2 和 3,对吗?我已经运行了代码,但是当我 table(myDT) 没有 3+ALL 类别
    • @Ale RE 特例,正确。 RE 表(myDT)。如果您复制并粘贴上面的代码,请注意 rbind 的输出未分配给任何内容(并且该代码行不会更改 myData)。您需要使用类似:newDT &lt;- rbind(&lt;..&gt;); newDT)
    • 我明白了……但我想要的完全不同。我的目标是获得一个具有完全相同数量的变量的新 data.frame,其中 ORDER 不采用值 1 到 90,而仅采用 1、2、3+ 或 ALL
    • @Ale,您希望ALL 的行包含在其他列中吗?
    • ALL 将是 ORDER 的一个新类别,其中包含所有 ORDER 的出生次数(来自 FREQUENCY),而 3plus 只有那些 >=3。到目前为止,我已经尝试将 ORDER 中的列 dcast 与列一起使用以生成新变量,但效果不佳。
    猜你喜欢
    • 2023-01-20
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多