楼主: MISSCCC
3023 7

[问答] R 如何利用向量方式计算数据填表格 [推广有奖]

  • 1关注
  • 1粉丝

已卖:9份资源

硕士生

92%

还不是VIP/贵宾

-

威望
0
论坛币
304 个
通用积分
14.0000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1510 点
帖子
78
精华
0
在线时间
303 小时
注册时间
2014-9-17
最后登录
2022-5-21

楼主
MISSCCC 发表于 2017-4-9 22:27:25 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
论坛内的各位大神们,

我想处理一笔数据,命名为data,截取前5笔如下:
1.PNG
每个ID有对应T1-4,res1-4.
T1对应res.1。同理,T2-4对应res.2-4。
T含有的数值是1-27 和空值
res含有的结果是1-4 和空值

我想对每个人建立一张表记录,此人在1-27种T之下的res。

例如,
第1个人,T1=2,res.1=1,得到的结果应该是在(1,2)的格子填上1。x=1表示第一个人,y=2表示T的结果。
第2个人,T1=2,T2=23,res.1=1,res.2=1,得到的结果应该是在(2,2)的格子填上1,(2,23)填上1
第5个人,T1=19,res.1=1,得到的结果应该是在(5,19)的格子填上1。
如果,第n个人,T1=19,res.1=4,得到的结果应该是在(n,19)的格子填上4。

由于资料笔数较多,将近500万笔。所以,使用回圈的方式,读取每一笔资料,并在对应的格子填入数值,耗时较久(2万笔就读了将近3个小时,RAM=16g)。
想请问论坛内的各位高手们有何想法?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Data 500万 RES RAM 何想法 如何

沙发
Eric1028 发表于 2017-4-10 07:45:12
*讀取資料可以試試data.table::fread

*建立紀錄可以試試tidyr::gather || tidyr::spread
已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

藤椅
cheetahfly 在职认证  发表于 2017-4-10 09:09:26
1,下面的操作是基于tbl_df类的,如何将现在的类型转换成tbl_df类,请自己尝试
2,对于ID的排序是基于数字的大小,如果要用其他方法排序,请自己尝试。
3,我假设数据不完整的地方是NA,而不是"",请自行转换或将下面关于NA的操作换成相应类似操作。

  1. library(tidyverse)
  2. addon <- data %>%
  3.      select(ID) %>%
  4.      arrange(ID) %>%
  5.      mutate(addon = (1:n() - 1)  * 27)
  6. data_temp <- data %>%
  7.      unite(T1_res.1, T1, res.1) %>%
  8.      unite(T2_res.2, T2, res.2) %>%
  9.      unite(T3_res.3, T3, res.3) %>%
  10.      unite(T4_res.4, T4, res.4) %>%
  11.      gather(T_res, value, 3:6) %>%
  12.      separate(value, c("T", "res")) %>%
  13.      arrange(ID, T_res) %>%
  14.      filter(T != "NA") %>%
  15.      mutate(T = as.integer(T), res = as.integer(res)) %>%
  16.      left_join(addon) %>%
  17.      mutate(T = T + addon)
  18. result <- numeric(length = 27 * nrow(addon))
  19. result[data_temp$T] <- data_temp$res
  20. result <- matrix(result, ncol = nrow(addon), byrow = TRUE)
复制代码


已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

板凳
MISSCCC 发表于 2017-4-10 10:25:02
Eric1028 发表于 2017-4-10 07:45
*讀取資料可以試試data.table::fread

*建立紀錄可以試試tidyr::gather || tidyr::spread
恩恩,謝謝您XD。
是用的fread~我再試試gather和spread~

报纸
MISSCCC 发表于 2017-4-10 10:26:13
cheetahfly 发表于 2017-4-10 09:09
1,下面的操作是基于tbl_df类的,如何将现在的类型转换成tbl_df类,请自己尝试
2,对于ID的排序是基于数字的 ...
恩呢~这两个尝试我应该可以处理~

谢谢大神!代码超详细!

地板
MISSCCC 发表于 2017-4-10 10:49:11
cheetahfly 发表于 2017-4-10 09:09
1,下面的操作是基于tbl_df类的,如何将现在的类型转换成tbl_df类,请自己尝试
2,对于ID的排序是基于数字的 ...
Joining, by = "ID"
Error: cannot allocate vector of size 602.7 Mb
In addition: Warning message:
Too few values at 3282294 locations: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
电脑吃不下……
在res.4的时候没法unite……res.1-3都可以……
         ID     BD T4_res.4 check.day Amount.1 Amount.2 check.y    T_res       T res addon
1     707 197704        _    200404      405      213    2004   Insure 1084840  NA     0
2     707 197704        _    200404      405      213    2004 T1_res.1       2   1     0

7
cheetahfly 在职认证  发表于 2017-4-10 11:10:07
为减少对内存的损耗,不必要的变量在运算时舍弃吧,就保留ID,T1-T4,res.1-res.4.
将res.1-4的顺序改变,如果出现问题的总是最后一个,那么还是内存的问题。
将原有的数据分成几段,分别处理,而后再合并,看能不能绕过内存问题。

8
MISSCCC 发表于 2017-4-12 00:03:07
cheetahfly 发表于 2017-4-10 11:10
为减少对内存的损耗,不必要的变量在运算时舍弃吧,就保留ID,T1-T4,res.1-res.4.
将res.1-4的顺序改变, ...
好的~~我试试,谢谢大神

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-17 17:07