Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将序列摘要数据转换为长格式和宽格式_R_Casting_Sequence_Dplyr_Rep - Fatal编程技术网

R 将序列摘要数据转换为长格式和宽格式

R 将序列摘要数据转换为长格式和宽格式,r,casting,sequence,dplyr,rep,R,Casting,Sequence,Dplyr,Rep,我需要转换一些以摘要形式出现的数据。 首先是长格式,然后是宽格式 对于每个id,我们都有一个id执行活动的次数。 数据是有序的 例如,对于id 1,他先执行3次“a”,然后执行4次“c”,依此类推 data = rbind( c(1, 'a', 3, 1), c(1, 'c', 4, 2), c(1, 'b', 6, 3), c(2, 'a', 2, 1), c(2, 'c', 1, 2), c(2, 'a', 5, 3) ) data = as.data

我需要转换一些以摘要形式出现的数据。 首先是长格式,然后是宽格式

对于每个id,我们都有一个id执行活动的次数。 数据是有序的

例如,对于id 1,他先执行3次“a”,然后执行4次“c”,依此类推

data = rbind(
  c(1, 'a', 3, 1), 
  c(1, 'c', 4, 2), 
  c(1, 'b', 6, 3), 
  c(2, 'a', 2, 1), 
  c(2, 'c', 1, 2), 
  c(2, 'a', 5, 3) 
  )
data = as.data.frame(data)
colnames(data) = c('id', 'act', 'times', 'order')

  id act times order
  1   a     3     1
  1   a     4     2
  1   b     6     3
  2   a     2     1
  2   c     1     2
  2   a     5     3
首先,我需要将此数据集转换为长格式。对于每个id,我需要重复活动(已排序),重复次数

  id act
  1  a
  1  a
  1  a
  ...
  1  b
  2  a
  2  a
  2  c
  2  a
  ...
我用的是

as.data.frame( cbind( as.character( rep(data$id, data$times)), as.character( rep(data$act, data$times))) )
 id  act_time1 act_time2 act_time3 act_time... act_timeN
 "1" "a"       "a"       "a"       "..."       "b"      
 "2" "a"       "a"       "c"       "..."       "a"  
但这太麻烦了

我的第一个问题是:您是否有简化此转换的解决方案

一旦数据转换成这种长格式, 我需要再次将其转换为一种广泛的格式,以便获得类似的内容

as.data.frame( cbind( as.character( rep(data$id, data$times)), as.character( rep(data$act, data$times))) )
 id  act_time1 act_time2 act_time3 act_time... act_timeN
 "1" "a"       "a"       "a"       "..."       "b"      
 "2" "a"       "a"       "c"       "..."       "a"  
显然,我在这里没有正确使用cast

cast(dataLong, formula = V1 ~ V2, value.var = 'V2')

有什么解决办法吗

您可以执行
库(splitstackshape);expandRows(data,“times”)
用于问题的第一部分,但我不确定我是否理解问题的第二部分中您想要的输出。例如,当
id==2
时,没有
b
。非常感谢。第二部分只是一个从长到宽的简单转换,但可能我没有完美地再现案例;图书馆(E2);dcast(getanID(expandRows(data,'times')、c('act','id'))[,indx:=paste0(order,.id)]、id~indx,value.var='act')Maybe
library(data.table);dcast(setDT(expandRows(data,“times”))[,indx:=seq_len(.N),by=id],id~indx,value.var=“act”)
您可以执行
库(splitstackshape);expandRows(data,“times”)
用于问题的第一部分,但我不确定我是否理解问题的第二部分中您想要的输出。例如,当
id==2
时,没有
b
。非常感谢。第二部分只是一个从长到宽的简单转换,但可能我没有完美地再现案例;图书馆(E2);dcast(getanID(expandRows(data,'times')、c('act','id'))[,indx:=paste0(order,.id)]、id~indx,value.var='act')Maybe
library(data.table);dcast(setDT(expandRows(data,“times”))[,indx:=seq_len(.N),by=id],id~indx,value.var=“act”)
您可以执行
库(splitstackshape);expandRows(data,“times”)
用于问题的第一部分,但我不确定我是否理解问题的第二部分中您想要的输出。例如,当
id==2
时,没有
b
。非常感谢。第二部分只是一个从长到宽的简单转换,但可能我没有完美地再现案例;图书馆(E2);dcast(getanID(expandRows(data,'times')、c('act','id'))[,indx:=paste0(order,.id)]、id~indx,value.var='act')Maybe
library(data.table);dcast(setDT(expandRows(data,“times”))[,indx:=seq_len(.N),by=id],id~indx,value.var=“act”)