用不同列表的另一个 Dataframe 减去列表中一个 Dataframe 的索引

crcmnpdw  于 2023-01-03  发布在  其他
关注(0)|答案(1)|浏览(116)

我有两个 Dataframe 列表,其中包含二进制值。
例如:第一个列表是lst1,它包含以下值

$`4`
 [1] "N" "N" "N" "A" "A" "A" "A" "N" 

$`7`
 [1] "N" "N" "N" "N" "N" "N" "N" "N"

第二个列表是lst2,它包含以下值

$`4`
 [1] "N" "N" "A" "A" "A" "A" "A" "N" "N" "N" 
$`7`
 [1] "N" "N" "N" "N" "N" "N" "N" "N" "N" "N"

我想在"A"的第一个示例处从lst1中减去lst2的索引。
因此,在lst1中,在 Dataframe $4处,`"A"`的索引值是**4**。类似地,在`lst2`中,在`$`4处,"A"的索引值是3。它们之间的差将是4 - 3 = 1。对于列表中的其他 Dataframe ,依此类推。
我试着寻找了几个解决方案,但都没有成功。

idfiyjo8

idfiyjo81#

我写了一个函数来计算期望的差值,它返回一个与参数列表同名的列表,其中包含计算出的差值。
请记住两件重要的事情:

  • 如果“A”未出现在任何向量中(向量7就是这种情况),则无法计算差值。
  • 如果名称不匹配,则计算没有任何意义,这就是为什么我抛出一个错误(stop

这是功能代码:

calcDif = function(lst1, lst2){
  if (!identical(names(lst1), names(lst2))){
    stop("Names do not match!")
  }

  difs = list()
  for (i in names(lst1)){
    idx1 = min(which(lst1[[i]] == "A"))
    idx2 = min(which(lst2[[i]] == "A"))
    difs[[i]] = idx1 - idx2
  }
  return(difs)
}

如果我用你的数据运行它,我得到:

calcDif(lst1, lst2)
$`4`
[1] 1

$`7`
[1] NaN

Warning messages:
1: In min(which(lst1[[i]] == "A")) :
  no non-missing arguments to min; returning Inf
2: In min(which(lst2[[i]] == "A")) :
  no non-missing arguments to min; returning Inf

如果我尝试使用不匹配的名称列表运行它,则:

calcDif(list(x = 1:2), lst2)
Error in calcDif(list(x = 1:2), lst2) : Names do not match!

相关问题