R函数比较csv文件并列出具有相同列名的行之间更改的内容

R函数比较csv文件并列出具有相同列名的行之间更改的内容,r,csv,R,Csv,我试图在r中编写一个函数,它获取两个具有相同列数和相同列名的相当大的csv文件,并比较行。但是我很难比较这些行,因为我想让函数返回数据在哪个列中变化。例如,我的数据帧/csv可能是: csv1: csv2: 我想让函数填充一个表/其他数据框,它的内容从csv1更改为csv2: qty name description price change 3 alpha number of alpha to order 20

我试图在r中编写一个函数,它获取两个具有相同列数和相同列名的相当大的csv文件,并比较行。但是我很难比较这些行,因为我想让函数返回数据在哪个列中变化。例如,我的数据帧/csv可能是:

csv1:

csv2:

我想让函数填充一个表/其他数据框,它的内容从csv1更改为csv2:

qty    name    description                 price    change
3     alpha    number of alpha to order    20       qty
3     beta     number of beta pieces       30       description
1     gamma    number of gamma to order    40       price
1     epsilon  number of epsilon to order  10       added
由于alpha的数量增加,beta的描述改变,gammas的价格也改变,我想把它们列出来,忽略delta中没有改变的地方,并显示epsilon是一个新添加的行,与第一个csv不同。这在r中可能吗?提前谢谢你


我当前的代码比较两个数据帧并输出3个csv文件。其中所有列在数据帧之间匹配,第二列与第一个数据帧具有唯一行,第三列与第二个数据帧仅具有唯一行。因此,我将比较后两个数据帧,因为第一个数据帧已经整理出所有列都相同的位置

如果按行比较,那么我们可以:

a <- which(df1!=df2,T)
data.frame(row = a[,1],change=names(df1)[a[,2]])

row      change
1   1         qty
2   2 description
3   3       price

a您是否逐行比较,如果是这样,数据集是否为。相同大小我认为逐行排列是最合理的解决方案,而且数据帧的长度可能不同。可能仍有一些行更改了多个列,或者是一个全新的行,在这种情况下,如果发现多个更改,则更改列将显示“qty,description”。如果行数不同,则可能需要交叉连接,然后进行比较。抱歉,我不清楚,我相信这只适用于大小相同的数据帧,并且可能有一些行添加了新行,而不是从第一个csv修改。为了清晰起见,我将这个案例添加到了我原来的帖子中!非常感谢。这是否意味着行也可以删除?是的,csv 1中的行可能不再存在于csv中2@pbthehuman这是否意味着每行的名称都是唯一定义的?ie
alpha
位于第1行,不能位于任何其他行??正确,如果alpha位于第1行,则不会出现在csv1的任何其他行中
qty    name    description                 price    change
3     alpha    number of alpha to order    20       qty
3     beta     number of beta pieces       30       description
1     gamma    number of gamma to order    40       price
1     epsilon  number of epsilon to order  10       added
a <- which(df1!=df2,T)
data.frame(row = a[,1],change=names(df1)[a[,2]])

row      change
1   1         qty
2   2 description
3   3       price
df3 <- merge(df1,df2,by = "name",all = T)
df3$row <- 1:nrow(df3)
df_from <- df3[2:4]
df_to <- df3[5:7]

a <- which(df_from!=df_to,T)
nw <- data.frame(row = a[,1],change=names(df1)[a[,2]])
added <- cbind(row = which(is.na(df_from[,1])),change = "added")
#removed <- data.frame(row = which(is.na(df_to[,1])),change = "removed")
merge(df3,rbind(nw,added)) # rbind(nw,added,removed)



 row    name qty.x            description.x price.x qty.y              description.y price.y      change
1   1   alpha     2 number of alpha to order      20     3   number of alpha to order      20         qty
2   2    beta     3  number of beta to order      30     3      number of beta pieces      30        name
3   4 epsilon    NA                     <NA>      NA     1 number of epsilon to order      10       added
4   5   gamma     1 number of gamma to order      10     1   number of gamma to order      40 description