小编Fab*_*bio的帖子

使用 dplyr 将列表重新组织为数据框

我将使用 dplyr 包的速度在整洁的数据帧中转换结构化列表。我会知道我现在发布的解决方案是“最先进的”还是更快的解决方案。

这是我的起始列表的示例:

l = list()
l[[1]] = list(member1=c(a=rnorm(1)),member2=matrix(rnorm(3),nrow=3,ncol=1,dimnames=list(c(letters[2:4]),c("sample"))))
l[[2]] = list(member1=c(a=rnorm(1)),member2=matrix(rnorm(3),nrow=3,ncol=1,dimnames=list(c(letters[2:4]),c("sample"))))
l[[3]] = list(member1=c(a=rnorm(1)),member2=matrix(rnorm(3),nrow=3,ncol=1,dimnames=list(c(letters[2:4]),c("sample"))))
Run Code Online (Sandbox Code Playgroud)

有了这个结果(向您展示玩具结构):

l
[[1]]
[[1]]$member1
    a 
0.3340196 

[[1]]$member2
 sample
b 1.0098830
c 0.6413375
d 0.9080675

[[2]]
[[2]]$member1
    a 
0.0590878 

[[2]]$member2
  sample
b  0.5585736
c -0.5936157
d -0.3985687

[[3]]
[[3]]$member1
     a 
0.06242458 

[[3]]$member2
  sample
b -0.2873391
c  0.5326067
d -1.1635551
Run Code Online (Sandbox Code Playgroud)

现在我将使用一个方便的函数来重新排列数据lapply并在列表中导航:

organizeSamples = function(x){
  member = x$member2
  output = data.frame(key=rownames(member),value=member[,1])
  return(output)
}
l_new = lapply(l, organizeSamples)
Run Code Online (Sandbox Code Playgroud)

现在 dplyr 发挥了作用:

samples = dplyr::bind_rows(l_new)
samples : …
Run Code Online (Sandbox Code Playgroud)

r list lapply dataframe dplyr

5
推荐指数
1
解决办法
2万
查看次数

使用汇总(dplyr)的结果来改变原始数据帧

我有一个相当大的数据框,其中包含一列POSIXct日期时间(每小时数据约为10年).我会在夏令时期间标记当天所有的行.例如,如果夏令时开始于'2000-04-02 03:00:00'(DOY = 93),我希望可以标记前两个小时的DOY = 93.虽然我dplyr的新手我会尽可能多地使用这个包,并避免for循环尽可能

例如:

library(lubridate)
sd = ymd('2000-01-01',tz="America/Denver")
ed = ymd('2005-12-31',tz="America/Denver")
span = data.frame(date=seq(from=sd,to=ed, by="hour"))
span$YEAR = year(span$date)
span$DOY = yday(span$date)
span$DLS = dst(span$date)
Run Code Online (Sandbox Code Playgroud)

要查找应用夏令时的一年中的不同日期,请使用dplyr

library(dplyr)
limits = span %.% group_by(YEAR) %.% summarise(minDOY=min(DOY[DLS]),maxDOY=max(DOY[DLS]))
Run Code Online (Sandbox Code Playgroud)

这给了

      YEAR minDOY maxDOY
    1 2000     93    303
    2 2001     91    301
    3 2002     97    300
    4 2003     96    299
    5 2004     95    305
    6 2005     93    303
Run Code Online (Sandbox Code Playgroud)

现在,我将在跨度数据帧中"管道"上述结果,而不使用低效的for循环.

解决方案1

在@aosmith的帮助下,只需两个命令即可解决问题(并避免使用'解决方案2'中的inner_join):

 limits = span %>% group_by(YEAR) %>% mutate(minDOY=min(DOY[DLS]),maxDOY=max(DOY[DLS]),CHECK=FALSE) …
Run Code Online (Sandbox Code Playgroud)

r posixct lubridate dplyr

3
推荐指数
1
解决办法
4734
查看次数

标签 统计

dplyr ×2

r ×2

dataframe ×1

lapply ×1

list ×1

lubridate ×1

posixct ×1