R 拆分表并写入多个.txt文件
我有以下格式的表格R 拆分表并写入多个.txt文件,r,R,我有以下格式的表格 Category Value Name_01 10 Name_01 12 Name_01 11 Name_02 12 Name_02 1 Name_03 13 Name_04 11 Name_05 12 Name_06 21 Name_07 3 Name_08 1 Name_09 23 Name_10 1 Name_11 123 Name_12 12 Name_13 1 Name_14 1 Name_15 12 Name_16 1 Name_17 2 Name_18 3
Category Value
Name_01 10
Name_01 12
Name_01 11
Name_02 12
Name_02 1
Name_03 13
Name_04 11
Name_05 12
Name_06 21
Name_07 3
Name_08 1
Name_09 23
Name_10 1
Name_11 123
Name_12 12
Name_13 1
Name_14 1
Name_15 12
Name_16 1
Name_17 2
Name_18 33
Name_19 21
Name_20 123
Name_21 32
Name_22 23
Name_23 21
我想将表写入一个.txt文件,但每个.txt文件最多只能处理20个唯一类别。因此,根据类别的总数,需要将表拆分到多个.txt文件中。有人知道我怎么用base R做这个吗?另一个复杂的问题是,所有的.txt文件都必须有编号为1-20的类别。在下面的示例中,我有一个包含名称_01-20的.txt文件,还有一个包含名称_21-23但重命名为名称_01-03的.txt文件 试试这个:
# split
myList <-
lapply(split(df1, as.numeric(df1$Category) %/% 21 + 1),
function(i){
x <- i
x$Category <- droplevels(x$Category)
x$Category <- as.factor(as.numeric(x$Category))
x
})
# write to csv
lapply(names(myList), function(i) write.csv(myList[[ i ]],
file = paste0(i, ".csv"),
row.names = FALSE))
#拆分
myList另一种解决方案:
maxCategory <- 20
N <- ceiling(1:nrow(data) / maxCategory)
for(i in unique(N)) {
d <- data[N == i, ]
# Get category with 0
foo <- 1:nrow(d)
foo <- ifelse(foo < 10, paste0("0", foo), foo)
d$Category <- paste0("Name_", foo)
# Write text file
write.table(d, paste0("split_", i, ".txt"),
row.names = FALSE, quote = FALSE)
}
这是一个整洁的解决方案
library('magrittr')
library('tidyverse')
df <- tribble(
~Category, ~Value,
'Name_01', 10,
'Name_02', 12,
'Name_03', 13,
'Name_04', 11,
'Name_05', 12,
'Name_06', 21,
'Name_07', 3,
'Name_08', 1,
'Name_09', 23,
'Name_10', 1,
'Name_11', 123,
'Name_12', 12,
'Name_13', 1,
'Name_14', 1,
'Name_15', 12,
'Name_16', 1,
'Name_17', 2,
'Name_18', 33,
'Name_19', 21,
'Name_20', 123,
'Name_21', 32,
'Name_22', 23,
'Name_23', 21
)
现在,我们可以将原始列嵌套到列表列中
df2 <- df2 %>%
group_by(group_id, file_name) %>%
nest(Category, Value)
print(df2, n=100)
# # A tibble: 2 x 3
# group_id file_name data
# <int> <chr> <list>
# 1 1 names_1-20.txt <tibble [20 x 2]>
# 2 2 names_21-23.txt <tibble [3 x 2]>
我们可以将上述所有步骤合并到一个管道中
df %>%
mutate(
category_id = parse_number(Category),
group_id = cumsum(dense_rank(Category) %% 20 == 1)) %>%
group_by(group_id) %>%
mutate(file_name = stringr::str_c('names_', min(category_id), '-', max(category_id), '.txt')) %>%
group_by(group_id, file_name) %>%
nest(Category, Value) %$%
walk2(
.$data,
.$file_name,
write_delim)
谢谢,抱歉,我不确定这是否有效,因为我可能有多行具有相同的类别值。@Ash_23S您必须编辑您的问题并提供示例数据,然后我可以调整我的代码:-)谢谢,我现在已经这样做了。不管每个.txt文件中有多少行,只要最多有20个唯一类别。谢谢,这并不能完全解决问题。每个表不受行数的限制,但受唯一类别数的限制。因此,根据上面的数据,第一个txt文件应该包含第1-23行,第二个txt文件应该包含第23行之后的内容。谢谢,抱歉,但我不知道如何使用它来编写我的文本文件?非常感谢。我尝试了这个,但在split.default(seq_len(nrow(x)),f,drop):强制引入的NAs(525次)“谢谢,我已经做了,我还没有包括所有525行。让我们吧。非常感谢您的帮助,但我确实需要一个Base R解决方案,因为我无法在软件中使用其他包。抱歉,我仍然没有找到解决方案。有人有什么想法吗?
df2 <- df2 %>%
group_by(group_id, file_name) %>%
nest(Category, Value)
print(df2, n=100)
# # A tibble: 2 x 3
# group_id file_name data
# <int> <chr> <list>
# 1 1 names_1-20.txt <tibble [20 x 2]>
# 2 2 names_21-23.txt <tibble [3 x 2]>
df2 %$%
walk2(
.$data,
.$file_name,
write_delim)
df %>%
mutate(
category_id = parse_number(Category),
group_id = cumsum(dense_rank(Category) %% 20 == 1)) %>%
group_by(group_id) %>%
mutate(file_name = stringr::str_c('names_', min(category_id), '-', max(category_id), '.txt')) %>%
group_by(group_id, file_name) %>%
nest(Category, Value) %$%
walk2(
.$data,
.$file_name,
write_delim)