应用问题给每个元素一个不同的名字

apply problem giving each element a different name

我需要优化一小段代码。代码可以简化如下。 假设我有两个数据框,我想获得一个“结果”数据框,它是具有某些条件的 data2 的选择。对于每一行,我需要添加一个与第一个数据框的行相对应的标识符。此标识符作为名为“身份”的列添加到结果数据框中。

data=data.frame(a=sample(1:100, 100, replace=TRUE),b=sample(1:100, 100, replace=TRUE) )
data2=data.frame(a=sample(1:100, 100, replace=TRUE),b=sample(1:100, 100, replace=TRUE) )

result=NULL
for(i in 1:nrow(data)){  # I loop on each row of "data"
  # if the difference between the current row and the column "a"
  # of "data2" is bigger than zero we store the values of data2
  boolvect=data[i,"a"]-data2$a>0
  ares=data2[ boolvect,]
  if(nrow(ares)>0){
    # we add an identifier for such event, the identifier is the
    # row number of "data"
    ares$identity=i
    result=rbind(result,ares)
  }
}

我尝试使用 apply with margin 1。结果是一样的,但我不知道如何正确处理“identity”列。

all_df=apply(data, 1, function(x, data2){
  val=as.numeric(x["a"])
  boolvect=val-data2$a>0
  return(data2[boolvect,])
  
}, data2=data2)

result2=do.call(rbind, all_df)

有什么帮助吗?

要获取标识列,我们需要遍历 data 的索引。

您可以使用 lapplyMap

result1 <- do.call(rbind, lapply(seq_along(data$a), function(i) {
  boolvect= data$a[i] - data2$a > 0
  if(any(boolvect)) transform(data2[boolvect, ], identity = i)
}))

Map :

result2 <- do.call(rbind, Map(function(x, y) {
  boolvect = x - data2$a > 0
  if(any(boolvect)) transform(data2[boolvect, ], identity = y)
}, data$a, 1:nrow(data)))

我会使用 lapply 而不是应用并输入每一行的索引以便 lapply 进行迭代。这是应用函数“知道它在哪一行”的唯一方法。

all_df=lapply(1:nrow(data), function(x, data, data2){
  boolvect=data[x,"a"]-data2$a>0
  ares=data2[ boolvect,]
  if(nrow(ares)>0){
    ares$identity=x
  }
  return(ares)
}, data =data,data2=data2)

result2=dplyr::bind_rows(all_df)