- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的数据文件是许多结构相似的文本文件的合并:
每个文件的此类“数据行”数量可能从 0 到数十万不等目标是添加新列,每一行将指示它相关的文件名
这是数据样本:
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")
我所有使用 lag
或类似函数的尝试都失败了。下面的示例是我的最佳尝试,但根据当前行值而不是上一行值填充新列。
transform(test.df,
fnameRaw = ifelse(lag(test.df$domain, 1) == "START OF NEW FILE ",
test.df$domain,
""))
domain count fnameRaw
1 START OF NEW FILE START OF NEW FILE
2 94_res.txt
3 google.ru 2
4 START OF NEW FILE START OF NEW FILE
5 95_res.txt
6 search-results.com 2
7 hpc.ru 1
8 theadgateway.com 1
9 google.by 6
是不是因为我的数据不是实时序列?或者因为应该添加一些技巧来解决第一行缺少“上一个”行的问题?还是别的?
附言期望的输出是这样的(fnameRaw 只是为了与实际输出进行比较而保留的中间字段)
domain count fnameRaw filename
1 START OF NEW FILE N/A
2 94_res.txt 94_res.txt 94_res.txt
3 google.ru 2 94_res.txt
4 START OF NEW FILE 94_res.txt
5 95_res.txt 95_res.txt 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
最佳答案
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
2) dplyr/no lag 如果没有 lag
,我们可以使用分组变量 g
对行进行分组,对于从第一个 START OF NEW FILE
,第二行为 2,依此类推。
library(dplyr)
DF %>%
group_by(g = cumsum(domain == "START OF NEW FILE")) %>%
mutate(filename = c(NA, rep(domain[2], n()-1))) %>%
ungroup %>%
select(-g)
2a) Base R/no lag 此基本解决方案类似于 (2)。创建一个向量 g
,每行 DF
有一个元素,其元素为 1 从第一个 START OF NEW FILE
行开始,2 从第一个开始第二等等。然后定义一个函数 make_filename
,它为 g
定义的一组创建 filename
列。最后将 make_function
应用于每个组。没有使用包。
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
是:
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")
关于r - 如果我的数据不是时间序列而是大量文本行,应该使用什么代替 'lag',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51862635/
我想开发一个 Skype 机器人,它将用户名作为输入,并根据用户输入以相反的字符大小写表示hello username。简而言之,如果用户输入他的名字 james,我的机器人会回复他为 Hello J
我是一名优秀的程序员,十分优秀!