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

数据帧通过匹配行和列设置单元格值

怀宇
2023-03-14

我在R中有一个数据帧,我想根据两个列表中的行和列的特定匹配来设置值。

以下是我必须遵循的流程。我有一个数据框,如下所示

   test.var1.t1  test.var2.t1   test.var1.t4   test.var3.t1   test.var3.t7
var1          0             0             0               0              0
var2          0             0             0               0              0
var3          0             0             0               0              0
var4          0             0             0               0              0

我有一个函数,它将列名作为输入,并返回一个与该列名关联的值。例如:一些_函数(“test.var1.t1”)可能返回10的值。

我有一些行名和列名的列表。我需要检查列表中的每个行名称和列名,将它们匹配在一起,计算匹配列的函数,并将值发布到相应的单元格中的数据框中。例如

行名称列表="var1""var2""var4"

列出col names=“test.var1.t1”“test.var2.t1”“test.var1.t4”“test.var3.t1”

var1应该与“test.var1.t1”和“test.var1.t4”匹配,所以我们从一些函数()中获得“test.var1.t1”和“test.var1.t4”的函数值。假设这些值分别为10和20。

var2应该与“test.var2.t1”匹配,所以获取“test.var2.t1”的函数值。假设这个值是15。

var4没有匹配的列,var3也不在行列表中,所以这应该单独留在数据帧中。

完成后,数据帧应更改为:

      x.var1.t1   x.var2.t1   x.var1.t4   x.var3.t1   x.var3.t7
var1         10           0          20           0           0
var2          0          15           0           0           0
var3          0           0           0           0           0
var4          0           0           0           0           0

最好的方法是什么?

共有1个答案

童子明
2023-03-14

你可以这样做:

nn <- c("var1" ,"var2", "var4")
## I am using a for loop because the side effect is desired here
for(x in nn) {
  ## find the corresponding column names
  col <- grep(x,names(dx),value=TRUE)
  ## if any apply the function 
  if(length(col)>0) dx[x,col] <- get_val(x)
}

使用虚拟函数测试get_val

get_val <- function(x){
  switch(x,
         var1=c(15,20),
         var2=c(10))
} 

dx

dx <- read.table(text=" test.var1.t1  test.var2.t1   test.var1.t4   test.var3.t1   test.var3.t7
var1          0             0             0               0              0
var2          0             0             0               0              0
var3          0             0             0               0              0
var4          0             0             0               0              0",
           stringsAsFactors = FALSE)

你会得到预期的结果:

#      test.var1.t1 test.var2.t1 test.var1.t4 test.var3.t1 test.var3.t7
# var1           15            0           20            0            0
# var2            0           10            0            0            0
# var3            0            0            0            0            0
# var4            0            0            0            0            0
 类似资料:
  • 基本上,它应该在步骤中找到指标为43且步骤=1的行,然后将该值放在新列中,在这种情况下,它将是“Gross value Added”。任何帮助都将非常感谢!

  • 我有一个类似于这个和这个的问题。区别在于我必须按位置选择行,因为我不知道索引。 我想做一些类似于,但iloc不允许这种访问。如果我执行,则会出现关于链接索引的警告。

  • 我读了“如何从数据帧的单元格中获取值?”以及“如何选择数据框的最后一列”。我有点困惑,什么是2018年接受的方法从熊猫数据帧的单元格获取值,因为已被弃用,并且在上的留档有点稀疏。我想按标签选择行,按位置/整数选择列。下面我使用的方法是2018年公认的方法吗?我有这个代码: 它生成一个字符串如下所示: 通过函数将其转换为数据帧,如下所示: 它是行的最后一列的值(整数1),标签为,我对此感兴趣。这是2

  • 我有一个名为“segments”的数据帧,看起来像这样: 我想让它看起来像这样。其中Outdegree是包含列A中的值的行数,例如10135在3行中,因此每行Outdegree设置为3: 以下是我正在尝试但不起作用的内容: 该代码将所有行相加,并将总计值提供给OUTDEGREE列

  • 我有一个包含100,000行(人)和500列(概率)的数据集,我想用测试概率扫描各列,以找到大于和最接近测试值的列标题(a、b或c ),并将标题记录在新列中。 以数据表为例: 新列将记录“a”(0.1 我最初做它作为一个矩阵,而不是data.table.下面的代码不会工作,但给出了一个想法,它是如何运作的 如何跨 data.table 中的列执行此匹配。我认为我需要使用 来自 的查询。但不确定如何

  • 我们如何从谷歌电子表格中的单元格中获得价值? 我有行和列索引从