R 用什么代替';滞后';如果我的数据不是时间序列,而是一大组文本行
我的数据文件是许多具有类似结构的文本文件的合并:R 用什么代替';滞后';如果我的数据不是时间序列,而是一大组文本行,r,lag,R,Lag,我的数据文件是许多具有类似结构的文本文件的合并: 行“新文件的开始” 与文件名一致 “数据线”有两列:域和事件数 每个文件中此类“数据行”的数量可能从0到十万不等 目标是为每一行添加新的列,该列将指示它所涉及的文件名 以下是数据示例: DF <- structure(list(domain = c("START OF NEW FILE", "94_res.txt", "google.ru", "START OF NEW FILE", "95_res.txt", "search-resu
DF <- structure(list(domain = c("START OF NEW FILE", "94_res.txt",
"google.ru", "START OF NEW FILE", "95_res.txt", "search-results.com",
"hpc.ru", "theadgateway.com", "google.by"), count = c(NA, NA,
2L, NA, NA, 2L, 1L, 1L, 6L)), row.names = c(NA, -9L), class = "data.frame")
是因为我的数据不是实时序列吗?或者因为应该添加一些技巧来解决第一行缺少“上一行”的问题?还是别的什么
另外,所需的输出是这样的smth(fnameRaw只是为了与实际输出进行比较而保留的中间字段)
lag
适用于时间序列,但如果使用dplyr,则会有一个lag
适用于数据帧
1)dplyr/lag我们可以这样使用lag
:
library(dplyr)
library(zoo)
DF %>%
mutate(filename = ifelse(lag(domain) == "START OF NEW FILE", domain, NA),
filename = na.locf0(filename),
filename = ifelse(domain == "START OF NEW FILE", NA, filename))
给予:
domain count filename
1 START OF NEW FILE NA <NA>
2 94_res.txt NA 94_res.txt
3 google.ru 2 94_res.txt
4 START OF NEW FILE NA <NA>
5 95_res.txt NA 95_res.txt
6 search-results.com 2 95_res.txt
7 hpc.ru 1 95_res.txt
8 theadgateway.com 1 95_res.txt
9 google.by 6 95_res.txt
2a)基本R/无滞后此基本解决方案类似于(2)。创建一个向量g
,每行DF
有一个元素,其元素为1,从新文件的第一行开始,从第二行开始,依此类推。然后定义一个函数make_filename
,该函数为g
定义的一个组创建filename
列。最后对每组应用make_功能
。没有使用任何软件包
g <- cumsum(DF$domain == "START OF NEW FILE")
make_Filename <- function(x) c(NA, rep(x[2], length(x) - 1))
transform(DF, filename = ave(DF$domain, g, FUN = make_filename))
我以P.S.的形式添加了预期输出。我需要滞后,因为新列的值取决于前一行-它等于前一行中“文件名”列的值,除非前一行的“域”值等于“新文件的开始”。您能以
dput(test.df)
格式提供您的输入数据吗?因为@G.Grothendieck已经提供了解决方案,不需要这样做-但是感谢您准备好help@useR,谢谢你的反馈-这对我很有用,因为我是这里的新手。下次我会努力遵守标准
domain count filename
1 START OF NEW FILE NA <NA>
2 94_res.txt NA 94_res.txt
3 google.ru 2 94_res.txt
4 START OF NEW FILE NA <NA>
5 95_res.txt NA 95_res.txt
6 search-results.com 2 95_res.txt
7 hpc.ru 1 95_res.txt
8 theadgateway.com 1 95_res.txt
9 google.by 6 95_res.txt
library(dplyr)
DF %>%
group_by(g = cumsum(domain == "START OF NEW FILE")) %>%
mutate(filename = c(NA, rep(domain[2], n()-1))) %>%
ungroup %>%
select(-g)
g <- cumsum(DF$domain == "START OF NEW FILE")
make_Filename <- function(x) c(NA, rep(x[2], length(x) - 1))
transform(DF, filename = ave(DF$domain, g, FUN = make_filename))
DF <- structure(list(domain = c("START OF NEW FILE", "94_res.txt",
"google.ru", "START OF NEW FILE", "95_res.txt", "search-results.com",
"hpc.ru", "theadgateway.com", "google.by"), count = c(NA, NA,
2L, NA, NA, 2L, 1L, 1L, 6L)), row.names = c(NA, -9L), class = "data.frame")