如何在多数据集R中使用分解条件和计算拆分和移动行
Posted
技术标签:
【中文标题】如何在多数据集R中使用分解条件和计算拆分和移动行【英文标题】:How to split and move row with facturating conditions & calculation in the multi dataset R 【发布时间】:2018-03-10 07:41:37 【问题描述】:有 3 个数据集:df2017 ,df2016 , df2018 .
# 2017 Dataset name :df2017
PoNo. Price R.No I.No RI.No Date
1 107 300 100;244 464;355 100-464;244-355 2017-02-23;2017-09-03
2 109 100 334 161 334-161 2017-09-23
3 124 504 124 115 124-115 2017-11-03
4 207 233 484;450;605 215;444;415 484-215;450-444;605-415 2016-02-03;2016-05-23;2017-04-10
5 223 4667 484;450;605 225;544;615 484-225;450-544;605-615 2017-02-03;2017-05-23;2018-04-03
6 340 1201 448;555;989 212;223;499 448-212;555-223;989-499 2017-01-13;2017-05-24;2017-12-03
7 345-1 2344 471;566 568;394 471-568;566-394 2017-04-03;2017-05-02
8 345-2 0 "" "" "" ""
所需形状:分割线并分配给属于的数据集。
按列的“;”分割贵重物品:$R.No,$I.No,$RI.No,$Date 并复制其他列。
计算col:$Price,除以Date在一个单元格中显示的次数。比如 --: 价格 / 1+(n(;))。
# 2017 Dateset --after split
PoNo. Price R.No I.No RI.No Date
1 107 150 100 464 100-464 2017-02-23
1 109 150 244 355 244-355 2017-09-03
2 107 100 334 161 334-161 2017-09-23
3 124 504 124 115 124-115 2017-11-03
4 207 77.66667 484 215 484-215 2016-02-03
4 207 77.66667 450 444 450-444 2016-05-23
4 207 77.66667 605 415 605-415 2017-04-10
如果 Date 中的贵重物品显示不同的年份,则将整行移至 同一年的数据集。
# 2016 dataset name :df2016
PoNo. Price R.No I.No RI.No Date
1 147 1133 120 414 120-414 2016-01-03
2 229 1512 354 395 354-395 2016-07-05
3 117 130 384 261 384-261 2016-10-13
4 207 77.66667 484 215 484-215 2016-02-03
4 207 77.66667 450 444 450-444 2016-05-23
2018年的数据集也有同样的操作(当然包括2016年)。
每个实际数据集包含超过 100 万行和 100 列,多少次 ";"出现在贵重物品中的情况不明。 我怎样才能通过有效的操作来实现它?(因为它们太大了)【问题讨论】:
而且数据集还包含很多“”和NA值。 【参考方案1】:这是一个带有tidyverse
包的解决方案。
df <- structure(list(PoNo. = c("107", "109", "124", "207", "223", "340",
"345-1", "345-2"), Price = c("300", "100", "504", "233", "4667",
"1201", "2344", "0"), R.No = c("100;244", "334", "124", "484;450;605",
"484;450;605", "448;555;989", "471;566", NA), I.No = c("464;355",
"161", "115", "215;444;415", "225;544;615", "212;223;499", "568;394",
NA), RI.No = c("100-464;244-355", "334-161", "124-115", "484-215;450-444;605-415",
"484-225;450-544;605-615", "448-212;555-223;989-499", "471-568;566-394",
NA), Date = c("2017-02-23;2017-09-03", "2017-09-23", "2017-11-03",
"2016-02-03;2016-05-23;2017-04-10", "2017-02-03;2017-05-23;2018-04-03",
"2017-01-13;2017-05-24;2017-12-03", "2017-04-03;2017-05-02",
NA)), .Names = c("PoNo.", "Price", "R.No", "I.No", "RI.No", "Date"
), problems = structure(list(row = 8L, col = NA_character_, expected = "7 columns",
actual = "6 columns", file = "'data.tsv'"), .Names = c("row",
"col", "expected", "actual", "file"), row.names = c(NA, -1L), class = c("tbl_df",
"tbl", "data.frame")), row.names = c(NA, -8L), spec = structure(list(
cols = structure(list(PoNo. = structure(list(), class = c("collector_character",
"collector")), Price = structure(list(), class = c("collector_integer",
"collector")), R.No = structure(list(), class = c("collector_character",
"collector")), I.No = structure(list(), class = c("collector_character",
"collector")), RI.No = structure(list(), class = c("collector_character",
"collector")), Date = structure(list(), class = c("collector_character",
"collector")), X7 = structure(list(), class = c("collector_character",
"collector"))), .Names = c("PoNo.", "Price", "R.No", "I.No",
"RI.No", "Date", "X7")), default = structure(list(), class = c("collector_guess",
"collector"))), .Names = c("cols", "default"), class = "col_spec"), class = c("tbl_df",
"tbl", "data.frame"))
这是我们通过将Price
除以日期数(;
+ 1 的数量)来计算的部分。然后我们将dalloliogm 的解决方案应用到每一列,使用dplyr::mutate_at()
用分号分隔条目。
df2017 <- df %>%
mutate(Price = as.numeric(Price) / (str_count(Date, ";")+1)) %>%
mutate_at(vars(R.No:Date), function(x) strsplit(as.character(x), ";")) %>%
unnest()
您现在可以按年份过滤条目并将这些条目绑定到相应的数据集。
df2018 <- df2017 %>%
filter(year(Date) == 2018)
df2016 <- df2017 %>%
filter(year(Date) == 2016)
df2017 <- df2017 %>%
filter(year(Date) == 2017)
df2017
## A tibble: 12 x 6
# PoNo. Price R.No I.No RI.No Date
# <chr> <dbl> <chr> <chr> <chr> <chr>
# 1 107 150. 100 464 100-464 2017-02-23
# 2 107 150. 244 355 244-355 2017-09-03
# 3 109 100. 334 161 334-161 2017-09-23
# 4 124 504. 124 115 124-115 2017-11-03
# 5 207 77.7 605 415 605-415 2017-04-10
# 6 223 1556. 484 225 484-225 2017-02-03
# 7 223 1556. 450 544 450-544 2017-05-23
# 8 340 400. 448 212 448-212 2017-01-13
# 9 340 400. 555 223 555-223 2017-05-24
# 10 340 400. 989 499 989-499 2017-12-03
# 11 345-1 1172. 471 568 471-568 2017-04-03
# 12 345-1 1172. 566 394 566-394 2017-05-02
【讨论】:
完美。非常精益的操作,让像我这样的初学者受益匪浅。添加 bind_rows() 将它们组合起来,所有这些都可以完成我需要的。非常感谢。以上是关于如何在多数据集R中使用分解条件和计算拆分和移动行的主要内容,如果未能解决你的问题,请参考以下文章
准时下班系列!Excel合集之第6集—如何拆分和统计单据金额
QDA |训练和测试数据集的长度 |如何拆分训练数据和测试数据?
当我在 Lasso Regression 中拆分训练集和测试集时,R^2 为负数
python - 如何在没有python中的train_test_split函数的情况下将数据中的固定行数拆分为Xtest、Xtrain、Ytrain和Ytest