更改数据帧中行和列的结构-R

更改数据帧中行和列的结构-R,r,dataframe,R,Dataframe,我有一个大型数据库(90000*1500),按儿童观察结果排序,其中包括他们母亲的信息。我想根据妈妈的数据对数据库进行排序 问题是每个孩子在DB mom bs中只出现一次。它最多可能出现10次 此外,我希望行的数量是不同母亲的数量(约40000)和每个孩子的一点数据-介于0-10之间 例如,我拥有的数据库和我想要创建的数据库: 您可以使用tidyr软件包和groupby完成此操作 group_by(data, mom) 然后每个妈妈都包含一个孩子的列表。然后可以按如下方式对数据库进行排序 ar

我有一个大型数据库(90000*1500),按儿童观察结果排序,其中包括他们母亲的信息。我想根据妈妈的数据对数据库进行排序

问题是每个孩子在DB mom bs中只出现一次。它最多可能出现10次

此外,我希望行的数量是不同母亲的数量(约40000)和每个孩子的一点数据-介于0-10之间

例如,我拥有的数据库和我想要创建的数据库:


您可以使用
tidyr
软件包和
groupby
完成此操作

group_by(data, mom)
然后每个妈妈都包含一个孩子的列表。然后可以按如下方式对数据库进行排序

arrange(data, id_num, .by_group = TRUE)
要筛选0到10之间的子项,请执行以下操作:

filter(data, age <= 10)

filter(数据,年龄您可以使用
tidyr
软件包,使用
groupby
完成此操作

group_by(data, mom)
然后,每个mom都包含一个孩子列表

arrange(data, id_num, .by_group = TRUE)
要筛选0到10之间的子项,请执行以下操作:

filter(data, age <= 10)

filter(数据,年龄您可以使用
重塑

 library(data.table)
 df = data.frame(
   'c' = c('c1', 'c2', 'c3', 'c4', 'c5'),
   'id_num' = seq(1,5),
   'age' = c(12, 15, 5, 8, 19),
   'mom'= c(1,3,1,2,3)
 )
 df
   c id_num age mom
1 c1      1  12   1
2 c2      2  15   3
3 c3      3   5   1
4 c4      4   8   2
5 c5      5  19   3
 df = setDT(df)[order(mom)]
 df[, id_child := seq(.N), mom]

 reshape(df, idvar = "mom", timevar = "id_child", direction = "wide")
   mom c.1 id_num.1 age.1  c.2 id_num.2 age.2
1:   1  c1        1    12   c3        3     5
2:   2  c4        4     8 <NA>       NA    NA
3:   3  c2        2    15   c5        5    19
库(data.table)
df=data.frame(
‘c’=c(‘c1’、‘c2’、‘c3’、‘c4’、‘c5’),
“id_num”=序号(1,5),
“年龄”=c(12,15,5,8,19),
‘mom’=c(1,3,1,2,3)
)
df
c id_num年龄妈妈
1 c1 1121
2 c2 2 15 3
3 c3 3 5 1
4 c4 4 8 2
5 c5 5 19 3
df=设定值(df)[订单(mom)]
df[,id_child:=seq(.N),mom]
重塑(df,idvar=“mom”,timevar=“id\u child”,direction=“wide”)
妈妈c.1 id数量1年龄1 c.2 id数量2年龄2
1:1 c1 1 12 c3 3 5
2:2 c4 4 8 NA NA
3:3 c2 2 15 c5 5 19

您可以使用
重塑

 library(data.table)
 df = data.frame(
   'c' = c('c1', 'c2', 'c3', 'c4', 'c5'),
   'id_num' = seq(1,5),
   'age' = c(12, 15, 5, 8, 19),
   'mom'= c(1,3,1,2,3)
 )
 df
   c id_num age mom
1 c1      1  12   1
2 c2      2  15   3
3 c3      3   5   1
4 c4      4   8   2
5 c5      5  19   3
 df = setDT(df)[order(mom)]
 df[, id_child := seq(.N), mom]

 reshape(df, idvar = "mom", timevar = "id_child", direction = "wide")
   mom c.1 id_num.1 age.1  c.2 id_num.2 age.2
1:   1  c1        1    12   c3        3     5
2:   2  c4        4     8 <NA>       NA    NA
3:   3  c2        2    15   c5        5    19
库(data.table)
df=data.frame(
‘c’=c(‘c1’、‘c2’、‘c3’、‘c4’、‘c5’),
“id_num”=序号(1,5),
“年龄”=c(12,15,5,8,19),
‘mom’=c(1,3,1,2,3)
)
df
c id_num年龄妈妈
1 c1 1121
2 c2 2 15 3
3 c3 3 5 1
4 c4 4 8 2
5 c5 5 19 3
df=设定值(df)[订单(mom)]
df[,id_child:=seq(.N),mom]
重塑(df,idvar=“mom”,timevar=“id\u child”,direction=“wide”)
妈妈c.1 id数量1年龄1 c.2 id数量2年龄2
1:1 c1 1 12 c3 3 5
2:2 c4 4 8 NA NA
3:3 c2 2 15 c5 5 19

这里有一个类似于的解决方案,但使用了
base R
,其中使用了
ave()

df$seq <- with(df,ave(id_num,mom,FUN = seq_along))
dfout <- reshape(df, idvar = "mom", timevar = "seq", direction = "wide")

df$seq这里有一个与
base R
类似的解决方案,其中使用了
ave()

df$seq <- with(df,ave(id_num,mom,FUN = seq_along))
dfout <- reshape(df, idvar = "mom", timevar = "seq", direction = "wide")

df$seq请提供一个最小的可复制示例。这个问题太复杂了,没有示例可供参考。请提供一个最小的可复制示例。这个问题太复杂了,没有示例可供参考。谢谢。我尝试过这样做,但我得到了“错误:无法分配大小为336KB的向量”@AviyaWeiser也许你有一个大数据帧需要处理?@AviyaWeiser我不确定是否有一些包具有这种
重塑
功能,以便可以处理更大的数据帧。否则最好编写一个定制的函数来处理it@AviyaWeiser我添加了另一个解决方案,试图处理大数据帧,您可以尝试一下谢谢。我试过这么做,但我得到了“错误:无法分配大小为336KB的向量”@AviyaWeiser也许你有一个大数据帧需要处理?@AviyaWeiser我不确定是否有一些包具有这种
重塑
功能,以便可以处理更大的数据帧。否则最好编写一个定制的函数来处理it@AviyaWeiser我添加了另一个解决方案,试图处理大数据帧,您可以试试看谢谢。我的代码:data_by_mom=setDT(jps)[order(mid_505)]data_by_mom[,kid_505:=seq(.N),mid_505]我得到了:
[.data.table
(data_by_mom,
:=
(kid_505,seq(.N)),mid_505):RHS的类型('integer')必须匹配LHS('double'))检查和强制会对最快的情况造成太多的影响。要么改变目标列的类型,要么强制RHs:=您自己(例如,使用1L而不是1),您应该考虑在代码< > DATAYBYOMMOR= SEDT(JPS)[DATAYBYBYMOR](KIDY505:= AS)之前,将列KIDY5055转换为数字(KIDY505)。]谢谢。我的代码:data\u by\u mom=setDT(jps)[order(mid\u 505)]data\u by\u mom[,kid\u 505:=seq(.N),mid\u 505]我得到了:
[.data.table
(data\u by\u mom,
:=/code>(kid\u 505,seq(.N)),mid\u 505):RHS的类型必须匹配LHS('integer')检查和强制会对最快的情况造成太多的影响。要么改变目标列的类型,要么强制RHs:=您自己(例如,使用1L而不是1),您应该考虑在代码< > DATAYBYOMMOR= SEDT(JPS)[DATAYBYBYMOR](KIDY505:= AS)之前,将列KIDY5055转换为数字(KIDY505)。][,kid_505:=seq(.N),mid_505]