【问题标题】:R-How to compare two dataframe and update list column valueR-如何比较两个数据框并更新列表列值
【发布时间】:2018-04-01 13:19:50
【问题描述】:

我有两个数据框数据框 1,数据框 2,如何将两个数据框列值与 P.Name、Name、Q.Name 进行比较并更新相同的值并附加不同的值行。请检查下面的例子。

数据框1

P.Name    Name      Q.Name                    values

Read     Mike        salseID                  list(value = "Y2TS", countofvalues = 1)

Write    jhon        Purchasedcust            list(value = "ANDERSON", countofvalues = 1)

write    jhon        shippingname             list(value = "Mikel", countofvalues = 5)

Read     peter       ordername                list(value = c("july", "mary", "petersonavail"), countofvalues = c(1, 2, 1))

Write    jack        deliveredadd             list(value = c("IICC PS LOL UY", "IICC UYY LOL UY"), countofvalues = c(2,1))

数据框 2

P.Name    Name      Q.Name                    values

Read     Mike        salseID                  list(value = "Y2TS", countofvalues = 1)

Write    jhon        Purchasedcust            list(value = "vjantony", countofvalues = 1)

write    jhon        CustaAddress             list(value = "Mikel", countofvalues = 5)

Read     peter       ordername                list(value = c("july", "mary", "parker"), countofvalues = c(1, 2, 1))

预期的数据框:

P.Name    Name      Q.Name                    values

 Read     Mike        salseID                  list(value = "Y2TS", countofvalues = 2)

 Write    jhon        Purchasedcust            list(value = c("ANDERSON","vjantony"), countofvalues = c(1,1))

 write    jhon        shippingname             list(value = "Mikel", countofvalues = 5)

 write    jhon        CustaAddress             list(value = "Mikel", countofvalues = 5)

 Read     peter       ordername                list(value = c("july", "mary", "petersonavail","parker"), countofvalues = c(2, 4, 1,1))

 Write    jack        deliveredadd             list(value = c("IICC PS LOL UY", "IICC UYY LOL UY"), countofvalues = c(2,1)) 

Data frame1 输入数据。

structure(list(P.Name = c("Read", "Write", "Write", "Read", "Write"
), Name = c("Mike", "jhon", "jhon", "peter", "jack"), Q.Name = c("salseID", 
"Purchasedcust", "shippingname", "ordername", "deliveredadd"), 
    values = list(structure(list(value = "Y2TS", countofvalues = 1L), .Names = c("value", 
    "countofvalues"), row.names = c(NA, -1L), class = c("tbl_df", 
    "tbl", "data.frame")), structure(list(value = "ANDERSON", 
        countofvalues = 1L), .Names = c("value", "countofvalues"
    ), row.names = c(NA, -1L), class = c("tbl_df", "tbl", "data.frame"
    )), structure(list(value = "Mikel", countofvalues = 5L), .Names = c("value", 
    "countofvalues"), row.names = c(NA, -1L), class = c("tbl_df", 
    "tbl", "data.frame")), structure(list(value = c("july", "mary", 
    "petersonavail"), countofvalues = c(1L, 2L, 1L)), .Names = c("value", 
    "countofvalues"), row.names = c(NA, -5L), class = c("tbl_df", 
    "tbl", "data.frame")), structure(list(value = c("IICC PS LOL UY", 
    "IICC UYY LOL UY"), countofvalues = c(2L, 1L)), .Names = c("value", 
    "countofvalues"), row.names = c(NA, -3L), class = c("tbl_df", 
    "tbl", "data.frame")))), .Names = c("P.Name", "Name", "Q.Name", 
"values"), row.names = c(NA, -5L), class = "data.frame")

数据框 2 输入数据

structure(list(P.Name = c("Read", "Write", "Write", "Read"), 
    Name = c("Mike", "jhon", "jhon", "peter"), Q.Name = c("salseID", 
    "Purchasedcust", "CustaAddress", "ordername"), values = list(
        structure(list(value = "Y2TS", countofvalues = 1L), .Names = c("value", 
        "countofvalues"), row.names = c(NA, -1L), class = c("tbl_df", 
        "tbl", "data.frame")), structure(list(value = "vjantony", 
            countofvalues = 1L), .Names = c("value", "countofvalues"
        ), row.names = c(NA, -1L), class = c("tbl_df", "tbl", 
        "data.frame")), structure(list(value = "Mikel", countofvalues = 5L), .Names = c("value", 
        "countofvalues"), row.names = c(NA, -4L), class = c("tbl_df", 
        "tbl", "data.frame")), structure(list(value = c("july", 
        "mary", "parker"), countofvalues = c(1L, 2L, 1L)), .Names = c("value", 
        "countofvalues"), row.names = c(NA, -3L), class = c("tbl_df", 
        "tbl", "data.frame")))), .Names = c("P.Name", "Name", 
"Q.Name", "values"), row.names = c(NA, -4L), class = "data.frame")

【问题讨论】:

  • 比较两列你可以做 df1$col1==df2$col1 ...你会得到 TRUE 或 FALSE ...但是你问题的第二部分真的不清楚......更新列表是什么意思?列表中的这些值来自哪里?如果没有进一步的解释,很难提供帮助..到目前为止,您应该展示您的代码..您已经尝试了什么?
  • @Thai,实际上我的期望是获取数据框 2 行值并通过 P.Name,Name ,Q.Name 比较数据框 1 行值,如果 P.Name,Name ,Q.Name 行值是常见的方法,我们需要更新值列表,否则需要添加比较行。例如:数据帧 1 的第一行和数据帧 2 的第一行值是共同的,同时列表值也很常见所以 countofvalues =2。但是第二行 P.Name,Name,Q.Name 行值相同但列表值不同所以 countofvalues = c(1,1))。
  • data2 的 dput 在哪里?
  • @jimbou,我已更新数据框 2 的 dput。请检查。
  • @Jimbou,感谢您的回复,但我的要求不同,您能否参考我上面的预期数据框。我需要分组 P.Name,Name , Q.Name.if 我需要附加的新行值。

标签: r


【解决方案1】:

您可以尝试tidyverse/dplyr 解决方案

library(tidyverse)
# remove NAs. Otherwise it will not work. Don't know if they are important. 
d1$values <- lapply(d1$values, function(x) x[!is.na(x[,1]),])
d2$values <- lapply(d2$values, function(x) x[!is.na(x[,1]),])

d1 %>% 
  unnest() %>% 
  bind_rows(unnest(d2)) %>% 
  group_by(P.Name, Name, Q.Name, value) %>% 
  summarise(countofvalues=sum(countofvalues)) 
# A tibble: 11 x 5
# Groups:   P.Name, Name, Q.Name [?]
   P.Name  Name        Q.Name           value countofvalues
    <chr> <chr>         <chr>           <chr>         <int>
 1   Read  Mike       salseID            Y2TS             2
 2   Read peter     ordername            july             2
 3   Read peter     ordername            mary             4
 4   Read peter     ordername          parker             1
 5   Read peter     ordername   petersonavail             1
 6  Write  jack  deliveredadd  IICC PS LOL UY             2
 7  Write  jack  deliveredadd IICC UYY LOL UY             1
 8  Write  jhon  CustaAddress           Mikel             5
 9  Write  jhon Purchasedcust        ANDERSON             1
10  Write  jhon Purchasedcust        vjantony             1
11  Write  jhon  shippingname           Mikel             5

然后你可以使用nest()嵌套最后一列

d1 %>% 
  unnest() %>% 
  bind_rows(unnest(d2)) %>% 
  group_by(P.Name, Name, Q.Name, value) %>% 
  summarise(countofvalues=sum(countofvalues)) %>% 
  nest(.key = "values")
# A tibble: 6 x 4
  P.Name  Name        Q.Name           values
   <chr> <chr>         <chr>           <list>
1   Read  Mike       salseID <tibble [1 x 2]>
2   Read peter     ordername <tibble [4 x 2]>
3  Write  jack  deliveredadd <tibble [2 x 2]>
4  Write  jhon  CustaAddress <tibble [1 x 2]>
5  Write  jhon Purchasedcust <tibble [2 x 2]>
6  Write  jhon  shippingname <tibble [1 x 2]>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多