【问题标题】:How to summarize data based on unique ID in R如何根据 R 中的唯一 ID 汇总数据
【发布时间】:2015-03-18 17:41:26
【问题描述】:

我有一个非常大的数据集,包含大约 3000 个观察值和 121 个变量。每个观察都包含有关电话的信息。每个设备都有一个唯一的 IMEI,并且数据集中有重复的 IMEI,因为一个设备可能有多个电话。

此数据最初是多个文件中的 JSON 格式。每一行都是一个单独的文件,所以我使用这个脚本使用 jsonlite pckg 导入 JSON 对象,然后使用 rbind 将它们全部绑定到一个大矩阵中,然后我使用 as.data.frame( ) 函数。

    require(jsonlite)
    files <- list.files()
    DF <- NULL

    for (f in files) {

        DF <- rbind(DF, fromJSON(f))
     }

    DF<- as.data.frame(DF)

但是,我想根据每个 UNIQUE IMEI 总结数据。

例如:

IMEI 123456789 有 10 个条目,变量为 call_duration、signal_strength、battery_level。我想将 10 个条目总结为一个条目,将 call_duration 相加,并平均 signal_strength 和 battery_level,因此结果将是:

   IMEI    call_duration(sum) signal_strength(mean) battery_level(mean)`

123456789     1982                    65               42

非常感谢。

【问题讨论】:

  • 你可以试试library(data.table); setDT(df1)[, list(call_duration=sum(call_duration), signal_strength=mean(signal_strength), battery_level=mean(battery_level)), by=IMEI][]
  • 感谢您的输入,但我收到一条错误消息:“by”或“keyby”列表中的项目长度为 (1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  • 您应该提供一些数据集的行,这些行会导致错误。

标签: r analytics analysis modeling


【解决方案1】:

你可以使用tapply来计算平均值(或总和):

call_durationSUM <− tapply(X=DATA$call_duration, INDEX=DATA$IMEI, sum)
signal_strengthMEAN <− tapply(X=DATA$signal_strength, INDEX=DATA$IMEI, mean)
battery_levelMEAN <− tapply(X=DATA$battery_level, INDEX=DATA$IMEI, mean)

然后将它们 cbind 在一起。

【讨论】:

  • 您好,感谢您的建议。我试了一下,得到以下错误: Tapply 中的错误(X = DF$avg_speed, INDEX = DF$imei, mean) : arguments must have same length
  • 我已经在我的原始帖子中添加了一些关于我如何获取数据的代码行。
  • 嗯,df 中的向量应该具有相同的长度。你确定你的名字拼写正确吗? (否则一个向量的长度为 0)。
【解决方案2】:

tapply 和 data.table 都是有用的命令。另一种可能是使用sqldf包,输入SQL命令如下:

# install.packages('sqldf') # If not already installed
# options(gsubfn.engine = "R") # needed for older version of R. Most will not need this

library(sqldf)
info <- sqldf('select IMEI, sum(call_duration) as sum_call_duration, 
    avg(signal_strength) as mean_signal_strength, 
    avg(battery_level) as mean_battery_level 
    from IMEIdatasetname group by IMEI')

【讨论】:

  • 如果您使用 R 3.0.0 或更高版本,则在 Mac 上不需要 options(gsubfn.engine = "R")。在第一行之前添加一个#,这样它就不会总是需要了。
  • @GGrothendieck 在第一行添加了注释。我正在使用最新的 R,但仍需要设置选项。
  • 您有 R 的自定义版本吗?我没有 Mac,但我知道自 3.0.0 以来 tcltk 已包含在 R 的标准 Mac 发行版中。我已经修复了前两行。
  • 我尝试了您的建议,但收到以下错误:sqliteSendQuery(conn, statement, bind.data) 中的错误:RAW() 只能应用于“原始”,而不是“字符”另外:警告消息:在 sqliteSendQuery(con, statement, bind.data) 中:关闭带有待处理行的结果集
  • 你能把你的代码贴出来让我们看看吗?我认为您的一列可能是不能在 sqldf 中使用的类型(可能是 POSIXlt)。或者,使用命令 str(IMEIdatasetname) 查找每列的类型并将其发布在此处。
猜你喜欢
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多