如何将长数据帧拆分为数据和元数据列表
How to split a long data frame into lists of data & metadata
我是 R 的新手,无法解决这个相当基本的问题。非常感谢您对此的帮助。
这里有一些玩具数据看起来像我的实际数据:
interval = rep(1:5,5)
value = runif(25)
category = c(rep("A", 10), rep("B", 15))
data = data.frame(category, interval, value)
数据将包含三列:包含分类变量的因子列、名为 "interval" 编码时间的列和包含因变量的 "value" 列。这些都表达了每个观察的属性,属于 "category" 并且随时间 "value" 变化 ("interval")。
category | interval | value;
A 1 1.0
A 2 2.3
A 3 0.5
A 4 0.9
B 1 1.5
B 2 1.2
B 3 0.4
...
现在,我想将每个观察结果提取到一个包含两列的 txt 文件中
interval | file.number
1 1.0
2 2.3
3 0.5
...
并在单独的 txt 文件中对元数据进行编码
category | file.number
A 1
A 2
A 3
B 4
B 5
B 6
...
这是你尝试的机会mapply
:
df <- read.table(text ="category interval value
A 1 1.0
A 2 2.3
A 3 0.5
A 4 0.9
B 1 1.5
B 2 1.2
B 3 0.4", header = T)
l <- split(df, df$interval)
#' Function writes interval data to csv
#'
#' @return metadata about written records
writeIntervalData <- function(df, i) {
write.csv(df, paste0("file", i, ".csv", row.names <- FALSE))
meta <- data.frame(category = unique(df$category))
meta$file <- i
return(meta)
}
meta <- mapply(writeIntervalData, l, names(l), SIMPLIFY = FALSE)
meta <- do.call("rbind", meta)
write.csv(meta[order(meta$category, meta$file),], "meta.csv", row.names = FALSE)
我是 R 的新手,无法解决这个相当基本的问题。非常感谢您对此的帮助。
这里有一些玩具数据看起来像我的实际数据:
interval = rep(1:5,5)
value = runif(25)
category = c(rep("A", 10), rep("B", 15))
data = data.frame(category, interval, value)
数据将包含三列:包含分类变量的因子列、名为 "interval" 编码时间的列和包含因变量的 "value" 列。这些都表达了每个观察的属性,属于 "category" 并且随时间 "value" 变化 ("interval")。
category | interval | value; A 1 1.0 A 2 2.3 A 3 0.5 A 4 0.9 B 1 1.5 B 2 1.2 B 3 0.4 ...
现在,我想将每个观察结果提取到一个包含两列的 txt 文件中
interval | file.number 1 1.0 2 2.3 3 0.5 ...
并在单独的 txt 文件中对元数据进行编码
category | file.number A 1 A 2 A 3 B 4 B 5 B 6 ...
这是你尝试的机会mapply
:
df <- read.table(text ="category interval value
A 1 1.0
A 2 2.3
A 3 0.5
A 4 0.9
B 1 1.5
B 2 1.2
B 3 0.4", header = T)
l <- split(df, df$interval)
#' Function writes interval data to csv
#'
#' @return metadata about written records
writeIntervalData <- function(df, i) {
write.csv(df, paste0("file", i, ".csv", row.names <- FALSE))
meta <- data.frame(category = unique(df$category))
meta$file <- i
return(meta)
}
meta <- mapply(writeIntervalData, l, names(l), SIMPLIFY = FALSE)
meta <- do.call("rbind", meta)
write.csv(meta[order(meta$category, meta$file),], "meta.csv", row.names = FALSE)