Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 拆分表并写入多个.txt文件_R - Fatal编程技术网

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)