如何在多数据集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 |训练和测试数据集的长度 |如何拆分训练数据和测试数据?

如何在限制行数的同时拆分 Pyspark 数据帧?

当我在 Lasso Regression 中拆分训练集和测试集时,R^2 为负数

python - 如何在没有python中的train_test_split函数的情况下将数据中的固定行数拆分为Xtest、Xtrain、Ytrain和Ytest

如何编写一个循环,其中数据集被拆分,每个拆分的趋势线斜率在 R 中给出