计算数据集中的一行与R中另一个数据集中的所有行之间的差异

计算数据集中的一行与R中另一个数据集中的所有行之间的差异,r,difference,R,Difference,我有两个数据集,我希望datset1中的每一行计算另一个数据集2中所有行之间的差异。我还将任何负差值替换为0。这是我的两个数据集的一个简单示例(因为我的数据集大约为1000*1000) 我事先感谢你的帮助 这是我用你的答案得到的,我想创建一个简单的函数。但我想选择我的数据集可以是矩阵或数据帧,我只能在数据集不是数据帧时生成错误: difference=function(df1,df2){ if(class(df1) != "data.frame" || class(df2

我有两个数据集,我希望datset1中的每一行计算另一个数据集2中所有行之间的差异。我还将任何负差值替换为0。这是我的两个数据集的一个简单示例(因为我的数据集大约为1000*1000)

我事先感谢你的帮助

这是我用你的答案得到的,我想创建一个简单的函数。但我想选择我的数据集可以是矩阵或数据帧,我只能在数据集不是数据帧时生成错误:

difference=function(df1,df2){
  if(class(df1) != "data.frame" || class(df2) != "data.frame") stop(" df1 or df2 is not  a dataframe!")
  df1=data.frame(df1)
  df2=data.frame(df2)
  ID1=seq(nrow(df1))
  ID2=seq(nrow(df2))
  new_df1 = df1[rep(ID1, each = nrow(df2)), ]
  new_df1[-1] = new_df1[-1] - df2[rep(seq(nrow(df2)), nrow(df1)), -1]
  new_df1[new_df1 < 0] = 0
  new_df1$total = rowSums(new_df1[-1])
  rownames(new_df1) = NULL
  output=new_df1
  return(output)
  
}
difference=函数(df1、df2){
如果(类(df1)!=“data.frame”| |类(df2)!=“data.frame”)停止(“df1或df2不是数据帧!”)
df1=数据帧(df1)
df2=数据帧(df2)
ID1=序号(nrow(df1))
ID2=序号(nrow(df2))
new_df1=df1[rep(ID1,each=nrow(df2)),]
new_df1[-1]=new_df1[-1]-df2[rep(seq(nrow(df2)),nrow(df1)),-1]
new_df1[new_df1<0]=0
new_df1$total=行和(new_df1[-1])
行名称(新的_df1)=空
输出=new_df1
返回(输出)
}
我知道我指定了df1=data.frame(df1)必须是一个数据帧,只是我不知道如何也包括它可以是一个矩阵


再次感谢您的帮助。

您可以使用for
nrow(df2)
次数重复
df1
中的每一行,并使用for
nrow(df1)
次数重复
df1中的每一行,以便数据帧的大小相等,我们可以直接减去值

#Repeat each row of df1 nrow(df2) times
new_df1 <- df1[rep(df1$ID, each = nrow(df2)), ]
#Repeat rows of df2 and subtract
new_df1[-1] <- new_df1[-1] - df2[rep(seq(nrow(df2)), nrow(df1)), -1]
#Replace negative values with 0
new_df1[new_df1 < 0] <- 0
#Add row-wise sum
new_df1$total <- rowSums(new_df1[-1])
#Remove rownames
rownames(new_df1) <- NULL
new_df1

#  ID Obs var total
#1  1   0   0     0
#2  1   0   0     0
#3  2   0   0     0
#4  2   0   2     2
#重复每行df1 nrow(df2)次

感谢Ronak Shah的帮助!我真的很喜欢它!请看一下我的代码,告诉我如果我想让数据集成为矩阵或数据帧,我应该怎么做?事实上,我不知道是否我必须回答我的问题,张贴我的代码修改或只是编辑我的问题?仍然是新的堆栈。非常感谢。您可以编辑您的问题以包含您拥有的代码。谢谢@Ronak!我编辑了我的帖子,非常感谢您的帮助。为什么不使用
is.data.frame
is.matrix
来了解传递的数据是数据帧还是矩阵。类似这样的
如果(!(is.data.frame(df1)和&is.data.frame(df2)| is.matrix(df1)和&is.matrix(df2))停止(“”)
谢谢@Ronak!它正在工作。我首先在想,为什么不直接使用
if(class(df1)=“character”| | class(df2)=“character”)
然后
停止
,但我担心用户会输入任何其他内容并继续计算。所以这样我肯定。再次感谢您的帮助和耐心!
difference=function(df1,df2){
  if(class(df1) != "data.frame" || class(df2) != "data.frame") stop(" df1 or df2 is not  a dataframe!")
  df1=data.frame(df1)
  df2=data.frame(df2)
  ID1=seq(nrow(df1))
  ID2=seq(nrow(df2))
  new_df1 = df1[rep(ID1, each = nrow(df2)), ]
  new_df1[-1] = new_df1[-1] - df2[rep(seq(nrow(df2)), nrow(df1)), -1]
  new_df1[new_df1 < 0] = 0
  new_df1$total = rowSums(new_df1[-1])
  rownames(new_df1) = NULL
  output=new_df1
  return(output)
  
}
#Repeat each row of df1 nrow(df2) times
new_df1 <- df1[rep(df1$ID, each = nrow(df2)), ]
#Repeat rows of df2 and subtract
new_df1[-1] <- new_df1[-1] - df2[rep(seq(nrow(df2)), nrow(df1)), -1]
#Replace negative values with 0
new_df1[new_df1 < 0] <- 0
#Add row-wise sum
new_df1$total <- rowSums(new_df1[-1])
#Remove rownames
rownames(new_df1) <- NULL
new_df1

#  ID Obs var total
#1  1   0   0     0
#2  1   0   0     0
#3  2   0   0     0
#4  2   0   2     2