r - 如何根据 R 中的中值随机选择和绑定数据列?
问题描述
我有两个宽格式的数据框。每一列都是各种维基百科文章的页面点击时间序列。
set.seed(123)
library(tidyr)
time = as.Date('2009-01-01') + 0:9
wiki_1 <- data.frame(
W = sample(1:1000,10,replace = T),
X = sample(1:100,10,replace = T),
Y = sample(1:10,10,replace = T),
Z = sample(1:10,10, replace = T)
)
wiki_2 <- data.frame(
A = sample(500:1000,10,replace = T),
B = sample(90:100,10,replace = T),
C = sample(1:10,10,replace = T),
D = sample(1:10,10,replace = T)
)
我想将第一个数据集 ( ) 中的一wiki_1
列与第二个数据集 ( ) 中的 n 列合并wiki_2
。但是这种选择应该基于列的中值与列的中值的接近程度wiki_2
,wiki_1
例如数量级。
在此示例中,对于 n = 2,Y 应与 C 和 D 匹配,因为它们的中值非常接近。
median(wiki_1$Y) # 7
median(wiki_2$C) # 6
median(wiki_2$D) # 4.5
我不确定如何实施中值差异标准以获得所需的结果。
此外,能够从wiki_2
满足标准的列中随机抽样会很有用,因为我的真实数据集有更多列。
到目前为止,这是我正在使用的:
df <- zoo(cbind(subset(wiki_1,select="Y"),
subset(wiki_2,select=c("C","D"))),time)
解决方案
我想这就是你所追求的。我添加了一个列wiki_2
,以便允许超过 2 个匹配项来显示匹配列的随机选择。
set.seed(123)
library(tidyr)
time = as.Date('2009-01-01') + 0:9
wiki_1 <- data.frame(
W = sample(1:1000,10,replace = T),
X = sample(1:100,10,replace = T),
Y = sample(1:10,10,replace = T),
Z = sample(1:10,10, replace = T)
)
wiki_2 <- data.frame(
A = sample(500:1000,10,replace = T),
B = sample(90:100,10,replace = T),
C = sample(1:10,10,replace = T),
D = sample(1:10,10,replace = T),
E = sample(1:20,10,replace = T)
)
selectColsByMedian <- function(df1, df2, ref_v, n_v, cutoff_v) {
#' Select Columns By Median
#' @description Select any number of columns from a test data.frame whose median value is
#' close to the median value of a specified column from a reference data.frame. "Close to"
#' is determined as the absolute value of the difference in medians being less thant he specified cutoff.
#' Outputs a new data.frame containing the reference data.frame's test column and all matching columns
#' from the test data.frame
#' @param df1 reference data.frame
#' @param df2 test data.frame
#' @param ref_v column from reference data.frame to test against
#' @param n_v number of columns from df2 to select
#' @param cutoff_v value to use to determine if test columns' medians are close enough
#' @return data.frame with 1 column from df1 and matching columns from df2
## Get median of ref
med_v <- median(df1[,ref_v], na.rm = T)
## Get other medians
otherMed_v <- apply(wiki_2, 2, function(x) median(x, na.rm = T))
## Get differences
medDiff_v <- sapply(otherMed_v, function(x) abs(med_v - x))
## Get whoever is within range (and order them)
inRange_v <- sort(medDiff_v[medDiff_v < cutoff_v])
inRangeCols_v <- names(inRange_v)
## Select random sample, if needed
if (length(inRangeCols_v) > n_v){
whichRandom_v <- sample(1:length(inRangeCols_v), size = n_v, replace = F)
} else {
whichRandom_v <- 1:length(inRangeCols_v)
}
finalCols_v <- inRangeCols_v[whichRandom_v]
## Final output
out_df <- cbind(df1[,ref_v], df2[,finalCols_v])
colnames(out_df) <- c(ref_v, finalCols_v)
## Return
return(out_df)
} # selectColsByMedian
### 3 matching columns, select 2
match3pick2_df <- selectColsByMedian(df1 = wiki_1, df2 = wiki_2, ref_v = "Y", n_v = 2, cutoff_v = 12)
match3pick2_df2 <- selectColsByMedian(df1 = wiki_1, df2 = wiki_2, ref_v = "Y", n_v = 2, cutoff_v = 12)
### 2 matching columns, select 2
match2pick2_df <- selectColsByMedian(df1 = wiki_1, df2 = wiki_2, ref_v = "Y", n_v = 2, cutoff_v = 10)
推荐阅读
- node.js - 使用 HTTPS 运行节点
- firebase - 无法从 NodeMCU 中的 firebase 读取数据
- java - 按钮不返回动作
- angular - 当使用 *ngFor 的项目数组发生变化时如何渲染所有子元素
- .net - SVG 只有在与 web.config 中的“application/json”mimeType 关联时才会正确呈现——否则会出现 406 错误
- ios - 是否可以将图像添加到 UISearchController 中的范围过滤器按钮?
- javascript - jquery变量未定义但控制台显示它包含一个值
- java - 我可以在本地网络上找到我的服务器的所有运行实例吗?
- regex - 之后抓取一个单词和可变数量的字符
- r - 如何更改 R 中的图例标签(ggplot2)