当前位置: 首页 > 知识库问答 >
问题:

R数据。跨列进行帧匹配,并返回最匹配的列名

贺宏富
2023-03-14

我有一个包含100,000行(人)和500列(概率)的数据集,我想用测试概率扫描各列,以找到大于和最接近测试值的列标题(a、b或c ),并将标题记录在新列中。

以数据表为例:

data <- data.table(   a = seq(0.2, 0.55, length.out = 9),
                      b = seq(0.35, 0.7, length.out = 9),
                      c = seq(0.5, 0.85, length.out = 9),
                   test = seq(0.1,  0.9, length.out = 9)
                  )

新列将记录“a”(0.1

       a    b   c   test
 0.20000    0.35000 0.50000 0.1
 0.24375    0.39375 0.54375 0.2
 0.28750    0.43750 0.58750 0.3
 0.33125    0.48125 0.63125 0.4
 0.37500    0.52500 0.67500 0.5
 0.41875    0.56875 0.71875 0.6
 0.46250    0.61250 0.76250 0.7
 0.50625    0.65625 0.80625 0.8
 0.55000    0.70000 0.85000 0.9

我最初做它作为一个矩阵,而不是data.table.下面的代码不会工作,但给出了一个想法,它是如何运作的

Switch <- pmax(as.matrix(data[,a:c])-matrix(rep(test,3), ncol=3, byrow=F),0)  
# subtracts test from columns a,b,c and replaces negative values with 0

FirstSwitch <- Switch[,b:c]>0 & MemSwitch[,a:b]==0
#  finds the first non-zero occurance

MonthSwitchMem <-  apply(FirstSwitch, 1, which.max)
# calculates the column where the test probability first exceeds

如何跨 data.table 中的列执行此匹配。我认为我需要使用 来自 的查询。但不确定如何做到这一点?

共有2个答案

濮献
2023-03-14

这适用于矩阵形式的数据(不是data.table)。

colnames(data)[apply(sign(data[,1:3] - data[,4]), 1, function(vec){ match(1, vec) })]
康照
2023-03-14

我修改了Karolis的回答,因此我将我的专栏从data.table转移到提供的代码片段中

data <- data.frame(   a = seq(0.2, 0.55, length.out = 9),
                  b = seq(0.35, 0.7, length.out = 9),
                  c = seq(0.5, 0.85, length.out = 9),
                  test = seq(0.1,  0.9, length.out = 9)
)
data2 <- data.table(data)
id <- c("a","b","c")
f <- function(x, t) {colnames(data2)[apply(sign(x-t), 1,function(vec){ match(1, vec) })]}
data2[, f(.SD, data2[,test]),.SDcols=id ]  #  this line takes the columns with the probabilities and the test probability and transfer to function f

感谢您的帮助(并重新格式化我的问题。这是我的第一篇文章,所以对格式不好表示歉意)

普拉尚特

 类似资料:
  • 我有两个具有经度和纬度值的数据帧,我想从数据帧#2中提取值(例如数据帧#2的第三列),这些值与数据帧1的列匹配...例如,数据帧1有两列(、),数据帧2有三列(、和一些值)...我想在数据帧1中添加第三列,其中的值对应于两个数据帧中两列完全匹配的值,类似于和...在、不匹配的对中,我希望添加,以便第三列(我要添加到数据。帧1)的长度为=。我尝试了merge函数,但在将的两列与的列进行匹配时遇到了困

  • 我已经尝试了所有的方法,最终我要求助于这个社区来解决这个谷歌表单公式。以下是一份示例表,以说明这种情况:https://docs.google.com/spreadsheets/d/1mLzsAyqtkASYMQsu8-igaUTURvhHiH-jXJN3qsr0mkU/edit?usp=sharing 每一行都是一个就诊的病人。有5个字段供患者提供电话号码(手机、家庭等)。)。在另一个标签(付费

  • 中的值匹配功能非常有用。但据我理解,它不足以支持二维或高维输入。 例如,假设和是相同列数的矩阵,我想将的行与的行进行匹配。“R”函数调用不这样做。列表的输入也存在同样的不足。 我已经实现了我自己的版本,名为(附在下面),但我想知道您对此任务的解决方案是什么。

  • 有了水果列表,我想检查它们是否存在于数据帧中(不管是哪个列),并指明它们。 这些守则的问题包括: 它显示的不是水果,而是整个内容。例如,14805行,应仅为“Blackberry”,而不是整个原始内容 我怎样才能做到呢?非常感谢。 这是当前输出和所需输出的屏幕截图。

  • 问题内容: 假设我们有一个具有如此简单结构的“汽车”表… 拳头,我选择的是汽车(1,黑色,重型,豪华轿车),然后我想获取相关汽车的列表,这些列表按匹配列的数量排序(没有任何列的权重)。所以,首先我期望看到(黑色,重型,豪华轿车)汽车,然后我期望看到只有2个匹配字段的汽车,等等。 是否可以使用SQL执行这种排序? 对不起,我的英语,但我真的希望我对您的问题很清楚。 谢谢你。 问题答案: 可能有几种方

  • 我要提前道歉——我知道这个问题可能已经在其他地方得到了解答,但是我似乎无法找到我需要的答案,也无法设法让我找到的其他代码适应我的需要。 我有一个数据框: 我想生成一个一个和两个之间COUNT值之差的数据帧,每个FILE都有一行,即。 我确信我应该能够相当容易地使用基础R或Plyr做到这一点,但我有点卡住了。任何人都可以建议一个好方法来做到这一点,也许在Plyr上有很好的教程,可能会帮助我解决将来的