gpt4 book ai didi

R:如何在数据框中进行偏移和匹配?

转载 作者:行者123 更新时间:2023-12-05 00:21:06 26 4
gpt4 key购买 nike

我想使用类似于 Excel 的 OFFSET 和 MATCH 函数的东西,这是一个示例数据集:
数据=

Which Test?|Test1   |Test2  |Test3  |RESULT
Test1 |TRUE |80% |0 |
Test2 |FALSE |25% |0 |
Test1 |TRUE |16% |0 |
Test3 |FALSE |12% |1 |
结果列应为:
Which Test?|Test1   |Test2  |Test3  |RESULT
Test1 |TRUE |80% |0 |TRUE
Test2 |FALSE |25% |0 |25%
Test1 |TRUE |16% |0 |TRUE
Test3 |FALSE |12% |1 |1
在最后的 RESULT 列中,我想要搜索哪个测试的测试结果?柱子。在此示例中,RESULT 列可以返回例如数字或字符串。在 Excel 公式中将是:
=OFFSET($A$1, ROW()-1,MATCH(A2,$B$1:$D$1,0))
到目前为止,我已经尝试使用 sapply 列出测试并将其返回到另一个函数,例如 which(colnames... 这就是我卡住的地方。

最佳答案

我会选择 sapply:

data <- read.table(text="Which Test?|Test1   |Test2  |Test3  |RESULT
Test1 |TRUE |80% |0 |
Test2 |FALSE |25% |0 |
Test1 |TRUE |16% |0 |
Test3 |FALSE |12% |1 |",
header=T,
sep="|",
stringsAsFactors=F,
strip.white=T)

data$RESULT <- sapply( 1:nrow(data), function(x) { data[x,data[x,1]] })

对于每一行,获取目标列 data[x,1] (内部访问),并为此列获取行值 data[x,...] .

输出:
> data
Which.Test. Test1 Test2 Test3 RESULT Result
1 Test1 TRUE 80% 0 NA TRUE
2 Test2 FALSE 25% 0 NA 25%
3 Test1 TRUE 16% 0 NA TRUE
4 Test3 FALSE 12% 1 NA 1
sapply 中的函数有两个 vars将会:
function(x) {
tcol <- data[x,1] # First column value of row x
data[x,tcol]) # Get the value at row x and column tcol
}

使用 Map/mapply 的方法将提供 'i' ( seq(nrow(data)) )、'j' ( match(data$Which.Test., names(data)) ) 行/列索引并使用 [从“数据”中提取元素。我们用 list 包装以便“数据”保留为单个 data.frame,并将通过“i”、“j”的长度进行循环。
 mapply(`[`, list(data), seq(nrow(data)), match(data$Which.Test., names(data) ) )
#[1] "TRUE" "25%" "TRUE" "1"

虽然,一种可能的矢量化方法只是
data[cbind(1:nrow(data), match(data$Which.Test., names(data)))]
## [1] " TRUE" "25%" " TRUE" "1"

这与 Which.Test. 中的值匹配针对 data 的列名并返回匹配列的索引。然后,我们通过将每行的这些列与 1:nrow(data) 组合来对它们进行子集化。使用 cbind .

上面对@DavidArenburg 解决方案的更详细解释(因为我不得不花一些时间来完全理解它):

子集运算符接受一个矩阵,所以我们这样做:
  • 1:nrow(data)很容易,它给出了一个向量 [1] 1 2 3 4对应于我们数据集中的行数
  • match(data$Which.Test., names(data)))给出每个匹配测试的索引[1] 1 2 3 4
  • cbind(..,..)绑定(bind)我们前面的两个点来构建一个矩阵:
         [,1] [,2]
    [1,] 1 2
    [2,] 2 3
    [3,] 3 2
    [4,] 4 4

    我们看到这个矩阵与我们希望取值的列的每一行匹配。因此,当将此矩阵作为我们数据集的选择器时,我们会得到正确的结果。然后我们可以将其分配给新变量或 df 的新列。
  • 关于R:如何在数据框中进行偏移和匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32252167/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com