我有几个文件 (60) 包含具有相同列名的表。我写下其中三个的例子。
我需要的是从每个文件(for(i in files) source(i) ?)中读取数据并从中创建一个表,我从每个文件中为每个 ID 提取一行(包含所有变量)。第一行从某个日期开始,在下一个文件中增加一个。
例如,第一个文件中的“起始”行将是行号。 10 日,从 1 月 10 日开始。
10 ID1 2000-01-10 20
现在,我跳转到下一个文件,我搜索相同的 ID 并对行号进行子集。 11(增加一天)表示从第二天开始的日期,2000-01-11
转到下一个文件,相同的 ID,子集行号。 12(与前一个文件相比增加1)等。
每个 ID 子集的行数等于文件数。迭代一直持续到我们到达 ID1 或最后一个文件的所有行。
然后,我们对下一个 ID 重复上述操作,即 ID2,其中起始行也来自第一个文件,并且与 ID1 具有相同的起始日期。它也是相对于其 ID 的行号 10,但在文件中为 22:22 = 10(ID1 + 2 增量)。
Day = seq(as.Date("2000-01-01"), length = 12, by = "days")
file1:
set.seed(123)
df1 <- data.frame( rowid = c(1:24),
ID = c("ID1", "ID1","ID1", "ID1","ID1", "ID1","ID1", "ID1", "ID1", "ID1","ID1",
"ID1","ID2", "ID2", "ID2", "ID2","ID2", "ID2", "ID2", "ID2","ID2", "ID2", "ID2", "ID2"),
Date = rep(Day, 2),
Var1 = sample(1:30, 24, TRUE) )
file2:
set.seed(123)
df2 <- data.frame( rowid = c(1:24),
ID = c("ID1", "ID1","ID1", "ID1","ID1", "ID1","ID1", "ID1", "ID1", "ID1","ID1", "ID1","ID2", "ID2", "ID2", "ID2","ID2", "ID2", "ID2", "ID2","ID2", "ID2", "ID2", "ID2"),
Date = rep(Day, 2),
Var1 = sample(40:60, 24, TRUE))
file3:
set.seed(123)
df3 <- data.frame(rowid = c(1:24),
ID = c("ID1", "ID1","ID1", "ID1","ID1", "ID1","ID1", "ID1", "ID1", "ID1","ID1", "ID1","ID2", "ID2", "ID2", "ID2","ID2", "ID2", "ID2", "ID2","ID2", "ID2", "ID2", "ID2"),
Date = rep(Day, 2),
Var1 = sample(70:100, 24, TRUE))
输出应如下所示: 10 ID1 2000-01-10 20
11 ID1 2000-01-11 44
12 ID1 2000-01-12 83
22 ID2 2000-01-10 9
23 ID2 2000-01-11 50
24 ID2 2000-01-12 98
关于如何获得它的任何想法?谢谢
最佳答案
像这样准备你的输入:
df_list <- list(df1, df2, df3)
start <- 10
你可以这样做:library(purrr)
library(dplyr)
imap_dfr(df_list, \(file, index) split(file, ~ ID) %>%
map_dfr(~ slice(.x, start - 1 + index))) %>%
arrange(ID)
返回所需的: rowid ID Date Var1
1 10 ID1 2000-01-10 20
2 11 ID1 2000-01-11 44
3 12 ID1 2000-01-12 83
4 22 ID2 2000-01-10 9
5 23 ID2 2000-01-11 50
6 24 ID2 2000-01-12 98
关于r - 从不同的文件增量地对行进行子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68023016/