r - 创建一个递归函数来计算所有列组合之间的归一化差异
问题描述
我有兴趣创建一个函数来计算data.frame
(or matrix
) 中所有列之间的归一化差异,然后用自己的输出重复该操作,即计算上一步获得的所有归一化差异之间的归一化差异。如果我可以使用参数设置“迭代”(或步骤,无论它们可以被称为什么)的数量,那就太好了(即,step=2
将返回在步骤 1 中获得的归一化差异的所有组合的归一化差异与输入数据框中的原始列)
首先,输出dput(db[1:20,8:13])
:
db <- structure(list(blue_2018 = c(319L, 159L, 204L, 123L, 13L, 250L,
151L, 271L, 288L, 213L, 199L, 222L, 302L, 370L, 170L, 178L, 159L,
178L, 254L, 204L), green_2018 = c(509L, 343L, 428L, 270L, 39L,
404L, 352L, 492L, 540L, 420L, 605L, 477L, 584L, 576L, 317L, 401L,
327L, 328L, 439L, 526L), nir_2018 = c(3584L, 2827L, 3170L, 2702L,
737L, 1532L, 1898L, 1720L, 2140L, 2326L, 4003L, 2050L, 2336L,
2780L, 2067L, 2177L, 1983L, 2384L, 2062L, 3354L), red_2018 = c(269L,
194L, 423L, 175L, 15L, 475L, 295L, 482L, 512L, 221L, 341L, 312L,
486L, 485L, 187L, 221L, 197L, 223L, 482L, 305L), swir1_2018 = c(1821L,
1117L, 1771L, 1170L, 222L, 1587L, 1150L, 1784L, 1955L, 1334L,
1699L, 1196L, 1739L, 1658L, 741L, 1088L, 903L, 1063L, 2033L,
1711L), swir2_2018 = c(716L, 444L, 801L, 426L, 85L, 1036L, 543L,
990L, 1039L, 651L, 717L, 557L, 919L, 900L, 328L, 497L, 407L,
481L, 1098L, 719L)), row.names = c(NA, 20L), class = "data.frame")
我可以创建一个函数,将归一化的差异作为 newdata.frame
与 new colnames
with 一起返回:
mycomb <- function(x){
var <- c("b","g","n","r","s1","s2")
comb <- combinations(n = ncol(x), r = 2, v = var, repeats.allowed = F)
name_diff_norm <- function(comb){
name<- apply(comb,1,paste0,collapse='')
return(name)
}
norm_diff <- name_diff_norm(comb)
comb_norm_diff <- combn(x, 2, FUN = function(x) (x[,1]-x[,2])/(x[,1]+x[,2]))
colnames(comb_norm_diff) <- norm_diff
return(comb_norm_diff)
}
mycomb(df)
但我不知道如何添加参数,即使step
函数迭代其输出的次数与指定的步骤一样多。另一个大问题是管理colnames
。在第一次迭代中,作为新列名,我分配了标准化差异所涉及的两个字母的首字母colnames
,但从第二次迭代开始,我不能做同样的事情。但是,这是次要问题,因为我可以更改colnames
之后。我强调该函数应该返回每个步骤的所有标准化差异,作为单个数据帧(所以我需要cbind
每个步骤的结果,但这也可以在以后完成)
解决方案
推荐阅读
- apache-spark - 之间语句不适用于 Hive Map 列 - Spark SQL
- kotlin - 如何将 Kotlin 的多平台依赖源附加到 IDEA?
- python - 使用 XlsxWriter 将 CSV 保存在 Excel 工作簿的不同工作表中
- r - R - 有条件地用来自另一个数据帧的值替换值
- mysql - 如何根据分隔符将 SQL 字符串拆分为两个变量?
- java - IE11 将 .xlsx 文件转换为 .xls 并将 .docx 文件转换为 .doc
- .net - HttpClient、WebClient 或 HttpWebRequest 首次尝试读取文件需要 90 秒,之后它会快速运行
- c - 写从main返回的错误与从main调用的函数中返回的错误不同吗?
- python - 无法在 Stripe webhook 中更新数据库
- python - 由于缺少发布文件,无法安装 SQAOD Python 模块