我想记录 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/