首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以批方式导出的脚本

以批方式导出的脚本
EN

Stack Overflow用户
提问于 2017-10-11 08:40:13
回答 2查看 238关注 0票数 0

我以前发过一个类似的问题,但现在我的问题变了,所以我想再发一次。我有一个包含两列的数据表: number和value,如下所示;

代码语言:javascript
运行
复制
number  value
1   test1
1   test2
1   test3
2   test4
2   test5
3   test6
3   test7
3   test8
4   test9
5   test10
6   test11
7   test12
8   test13
9   test14
10  test15
11  test16
12  test17
13  test18
14  test19
15  test20
16  test21
17  test22
18  test23
19  test24
20  test25
21  test26
22  test27
23  test28

我想将数据表导出为多个.txt文件。第一个文本文件应该包含整个数据表的子集,其中的数字在1-20之间。第二个文本文件应该包含一个数据子集,其中的数字在21-40之间,第三个文本文件的数字在41-60之间,依此类推。数据表是动态的,因此导出的.txt文件数量将有所不同。

此外,在所有.txt文件中,“数字”必须介于1-20之间。因此,如果数字是21,则必须将其重命名为1,如果数字为22,则必须将其重命名为2,等等。

有人能帮忙吗?在上面的示例中,应该有两个.txt文件,第一个文件有25行,第二个文件有3行,第二个.txt文件包含数字21,22,23,重命名为1,2,3。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-11 09:15:59

首先,我会使用split()将您的数据帧分成20行。此函数将根据某种标准将数据帧拆分。在您的例子中,这个标准可能是这样的:“行号除以20 (舍入为上/下为整数)的结果是什么?”根据这一规则,输入数据将被分割。

代码语言:javascript
运行
复制
nrows <- 1:nrow(df)
df    <- split(df, floor(nrows/20))

编辑:如果要根据df$number中的值进行拆分,则应该使用df <- split(df, floor((df$number-1)/20))

其次,对于高于20的所有数,您必须以某种方式将20的倍数减去。我会使用模%% 20,但这也会将20转换为零。

代码语言:javascript
运行
复制
ready_for_export <- lapply(df, function(x){
                       x$number <- (x$number - floor((x$number-1)/20)*20)
                       return(x)})

最后,将元素保存在列表ready_for_export中,保存在单独的txt文档中。为此,我将使用for-loop:

代码语言:javascript
运行
复制
for(i in seq_along(ready_for_export)){
   write.table(ready_for_export[[i]], paste0("test", i, ".txt"))
}

可能有一些包,这将使它看起来更好,执行得更快,然而,我喜欢尽可能多地使用基本R

票数 2
EN

Stack Overflow用户

发布于 2017-10-11 10:05:20

tidyverse允许您编写更多的解决方案。(整洁;)

假设您的数据在变量df

代码语言:javascript
运行
复制
library(tidyverse)

df %>%
  mutate(set = plyr::round_any(number - 1, 20, floor) %>% as.factor %>% as.numeric) %>% 
  group_by(set) %>%
  mutate(set_num = number %>% as.factor %>% as.numeric) %>%
  ungroup ->
  df_prep

df_prep$set %>%
  unique %>%
  walk(~ write_tsv(df_prep %>% 
                     filter(set == .x) %>%
                     select(number = set_num,
                            value),
                   paste0("file-", .x, ".tsv")))

其中,as.factor %>% as.numeric技巧将新的唯一数字ids分配给列的不同值。正确分配的->有点不寻常,但使magrittr管道流得很好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46683633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档