【发布时间】:2021-07-22 15:13:57
【问题描述】:
我有两个看起来像这样的 df
library(tidyverse)
iris <- iris%>% mutate_at((1:4),~.+2)
iris2 <- iris
names(iris2)<-sub(".", "_", names(iris2), fixed = TRUE)
我的目标是减少iris 中高于iris2 中相应变量最大值的变量值,以匹配iris2 中的最大值。
我写了一个函数来做这个。
max(iris$Sepal.Length)
[1] 9.9
max(iris2$Sepal_Length)
[1] 7.9
# i want every value of iris that is >= to max value of iris2 to be equal to the max value of iris 2.
# my function:
fixmax<- function(data,data2,var1,var2) {
data<- data %>%
mutate("{var1}" := ifelse(get(var1)>=max(data2[[var2]],na.rm = T),
max(data2[[var2]],na.rm = T),get(var1)))
return(data)
}
# apply my function to a variable
tst_iris <- fixmax(iris,iris2,"Sepal.Length","Sepal_Length")
max(tst_iris$Sepal.Length)
7.9 # it works!
我面临的挑战是我想在两个变量列表中迭代我的函数顺序 - 即Sepal.Length 和Sepal_Length,Sepal.Width 和@ 987654329@等
有人知道我该怎么做吗?
我尝试使用Map,但我做错了。
lst1 <- names(iris[,1:4])
lst2 <- names(iris2[,1:4])
final_iris<- Map(fixmax,iris, iris2,lst1,lst2)
我的目标是获得一个 df (final_iris),其中每个变量都已使用fixmax 指定的标准进行了调整。
我知道我可以通过像这样在每个变量上运行我的函数来做到这一点。
final_iris <- iris
final_iris <- fixmax(final_iris,iris2,"Sepal.Length","Sepal_Length")
final_iris <- fixmax(final_iris,iris2,"Sepal.Width","Sepal_Width")
final_iris <- fixmax(final_iris,iris2,"Petal.Length","Petal_Length")
final_iris <- fixmax(final_iris,iris2,"Petal.Width","Petal_Width")
但在实际数据中,我必须运行此操作数十次,并且我希望能够按顺序循环我的函数。
有谁知道我如何依次循环fixmax 和lst1 和lst2?
【问题讨论】: