我以前发过一个类似的问题,但现在我的问题变了,所以我想再发一次。我有一个包含两列的数据表: number和value,如下所示;
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。
发布于 2017-10-11 09:15:59
首先,我会使用split()
将您的数据帧分成20行。此函数将根据某种标准将数据帧拆分。在您的例子中,这个标准可能是这样的:“行号除以20 (舍入为上/下为整数)的结果是什么?”根据这一规则,输入数据将被分割。
nrows <- 1:nrow(df)
df <- split(df, floor(nrows/20))
编辑:如果要根据df$number
中的值进行拆分,则应该使用df <- split(df, floor((df$number-1)/20))
其次,对于高于20的所有数,您必须以某种方式将20的倍数减去。我会使用模%% 20
,但这也会将20转换为零。
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:
for(i in seq_along(ready_for_export)){
write.table(ready_for_export[[i]], paste0("test", i, ".txt"))
}
可能有一些包,这将使它看起来更好,执行得更快,然而,我喜欢尽可能多地使用基本R
。
发布于 2017-10-11 10:05:20
tidyverse
允许您编写更多的解决方案。(整洁;)
假设您的数据在变量df
中
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
管道流得很好。
https://stackoverflow.com/questions/46683633
复制相似问题