r - 如何确定数据框中的更改?

标签 r

我想记录 data.frame 中的更改:

原始数据框中,我具有以下结构:

library(dplyr)
library(compare)

origianl <- data_frame( name = c('John','Tim','Allan','Mitch'),

                          A = c(0,1,1,0),

                          B = c(1,0,0,1),

                          C = c(0,0,0,0),

                          D = c(1,0,0,1))

#> data.frame(origianl)

   name           A           B           C           D
1  John           0           1           0           1
2   Tim           1           0           0           0
3 Allan           1           0           0           0
4 Mitch           0           1           0           1

例如,约翰为 B 和 D 效力。

更改的数据框中,我具有以下结构:

changed <- data_frame( name = c('John','Tim','Allan','Mitch'),

                                A = c(1,0,1,0),

                                B = c(0,0,0,0),

                                C = c(0,1,0,1),

                                D = c(1,0,0,1))

#> data.frame(changed)
   name           A           B           C           D
1  John           1           0           0           1
2   Tim           0           0           1           0
3 Allan           1           0           0           0
4 Mitch           0           0           1           1

例如,约翰更换了球队,现在为 A 和 D 效力。

有几个限制:

我每天都会检查原文。玩家可以为多支球队效力,也可以为一支球队效力,并且可以更换球队。他们至少被分配到一个团队。

我尝试编写一个函数,记录两个特定列中的更改when from

所需的输出表可能如下所示,基本上是更改,并有两个附加列记录更改:

#> data.frame(new_original)
   name           A           B           C           D  from    when
1  John           1           0           0           1   B     2017-01-01
2   Tim           0           0           1           0   A     2017-01-01
3 Allan           1           0           0           0   NA     NA
4 Mitch           0           0           1           1   B     2017-01-01

到目前为止我已经尝试过:

my_func <- function(origianl, changed) {
# Get the difference
 difference <- anti_join(changed, origianl)
# find the changes in the original data
  differ <- origianl[origianl$name %in% difference$name, ]

# check whether condition is satisfyied
if (nrow(differ) == nrow(difference) &&
  nrow(anti_join(changed, origianl)) > 0)

{
 new_original <-
  cbind(changed, from = names(which(
    compare(difference[2:ncol(difference)], differ[2:ncol(differ)], allowAll =
              TRUE)$detailedResult == FALSE, when = Sys.Date()
  )))

 }

 return(new_original)
}

new_original = my_func(origianl, changed)

参数中的结果意味着不同的行数:4、3 来自 cbind 命令。不知道如何达到理想的输出

最佳答案

这是使用基本 R 的可能矢量化方法。您尚未指定 when 列的计算方式(这只是当前日期吗?),但以下是 from 的计算方式可以很容易地计算

indx <- which((origianl[-1] - changed[-1]) == 1, arr.ind = TRUE)
changed[indx[, "row"], "from"] <- names(changed)[-1][indx[, "col"]]
changed
#    name A B C D from
# 1  John 1 0 0 1    B
# 2   Tim 0 0 1 0    A
# 3 Allan 1 0 0 0 <NA>
# 4 Mitch 0 0 1 1    B

关于r - 如何确定数据框中的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42786610/

相关文章:

r - 给定开始日期和结束日期, reshape /扩展之间每一天的数据(连续的每一天)

r - 使用 ggplot2 表示散点图中每个点的小饼图

r - ggplot中是否有与plot中的varwidth选项等效的东西?

R Shiny 应用程序在不同操作系统中的兼容性?

r - 在 R 中使用自己的方法创建新类时,为什么在仅输入对象名称时不自动打印?

r - 如何删除 RStudio 查看器 Pane 中绘图的空白/白边距

R ggplot2 在传说中给出了口音

返回值的所有可能组合

r - 在 Shiny 的 bs4Dash 侧边栏折叠但图像是图标菜单不显示

r - 为什么这些操作不会产生相同的结果?管道进入 . (点)