应用问题给每个元素一个不同的名字
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
的索引。
您可以使用 lapply
或 Map
。
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)
我需要优化一小段代码。代码可以简化如下。 假设我有两个数据框,我想获得一个“结果”数据框,它是具有某些条件的 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
的索引。
您可以使用 lapply
或 Map
。
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)