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

将df1中的行值与df2中的列名进行匹配,以返回df2的相同行值

赵晨
2023-03-14

这个问题类似于我在这里发现的:将一个数据框中的行(带有行名)与另一个数据框中匹配的列名相乘

但是不是匹配行和乘法,我想将df1中的列值与df2中的列名匹配,并在新的df3中返回df2的相应行值。

df1 <- data.frame(V1=c(1:6),V2=c("X3", "X3_8", "NA", "X5", "X4_5", "X3_8"))
df1
    V1 V2
  1 1  X3
  2 2  X3_8
  3 3  NA
  4 4  X5
  5 5  X4_5
  6 6  X3_8

df2 <- data.frame(name=c("John", "Mary", "Joe", "Tim", "Bob", "Pat"),
                  X3=c(0.5, 1.2, 0.75, 3.1, 2.0, 1.1),
                  X5=c(1.0, 2.3, 4.2, 5, 1.1, 3.0),
                  X3_8=c(0.6, 1.0, 2.0, 1.0, 0.7, 1.4),
                  X4_5=c(0.4, 0.3, 3.0, 1.0, 2.0, 0.9))
df2
     name   X3    X5    X3_8  X4_5
  1  John   0.5   1.0   0.6   0.4
  2  Mary   1.2   2.3   1.0   0.3
  3  Joe    0.75  4.2   2.0   3.0
  4  Tim    3.1   5.0   1.0   1.0
  5  Bob    2.0   1.1   0.7   2.0
  6  Pat    1.1   3.0   1.4   0.9

这就是我想要的:

df3 <- data.frame(name=c("John", "Mary", "Joe", "Tim", "Bob", "Pat"),
                  values=c(0.5, 1.0, NA, 5.0, 1.0, 1.4))
    name values
  1 John    0.5
  2 Mary    1.0
  3  Joe     NA
  4  Tim    5.0
  5  Bob    1.0
  6  Pat    1.4      

在我的实际 df1 和 df2 中有 64 行,其中 df1 中的“V1”对应于 df2 中“name”列的数字索引。在我的df2中,有22列,即一列带有“名称”,另一列21列带有“X *”,以匹配df1中的“V2”。我尝试将“V2”转换为行名,但这不起作用,因为存在NA和重复值。

奖励,但不是必要的:我有10个DF1和10个DF2,并且需要为每对DF1和DF2执行此操作,其中DF1和df2的名称包含普通年份。例如,我需要将df1_2004与df2_2004进行匹配,创建df3_2004,然后转到df1_ 2005和df2_ 2004,以此类推。我确信有一种优雅的方法可以做到这一点,而无需使用For循环和if语句。

感谢您的任何帮助。我确信有一个简单的基本R或整洁的解决方案,但我正在努力将这些碎片放在一起。原谅我的新手对R中索引的理解。

共有2个答案

于正志
2023-03-14

世界上功能较少的程序:

n_row <- nrow(df1)
# corce the variable V1 in a factor with the name variables of the
# df2
df1$V1 <- factor(df1$V1, labels = df2$name)
# coerce the variable V2 into a character vector or use 'stringsAsFactors = FALSE' 
# when you read the data frame
df1$V2 <- as.character(df1$V2)
# create a copy of df1 to impute values of the V2 col
df3 <- df1
for (i in 1:n_row) {
  col_index <- which(df1[i, "V2"] == names(df2), arr.ind = TRUE)
  row_index <- which(df1[i, "V1"] == df2$name, arr.ind = TRUE)
  if (length(col_index) == 0) {
    df3[i, "V2"] <- NA
  } else {
    df3[i, "V2"] <- df2[row_index, col_index]
  }
}
names(df3) <- c("name", "values")

给出:

#>df3
   name  values
 1 John  0.5
 2 Mary    1
 3  Joe <NA>
 4  Tim    5
 5  Bob    2
 6  Pat  1.4
慕高阳
2023-03-14

将< code>df2整形为long格式并与< code>df1左连接相结合,可以得到想要的结果。

使用:

library(dplyr)
library(tidyr)

df3 <- df1 %>% 
  mutate(name = df2$name[V1]) %>%  # or just mutate(name = df2$name) when the index is equal to the rownumbers
  left_join(., df2 %>% 
              gather(V2, values, -1) %>% 
              group_by(V2) %>% 
              mutate(V1 = row_number()), 
            by = c('V2','V1')) %>% 
  select(name = name.x, values)

给出:

> df3
  name values
1 John    0.5
2 Mary    1.0
3  Joe     NA
4  Tim    5.0
5  Bob    2.0
6  Pat    1.4
 类似资料:
  • 我有3个数据帧在df1 df2 DF3 我正在寻找以下输出df1 我已经尝试了多种方法,但无法实现这一点,我是Python编码新手,有什么方法可以实现这一点吗?在我尝试的代码下面,它确实匹配并返回find/not found,但还无法为匹配行分配df1[col4]=df2[col4]。

  • 问题内容: 我正在尝试执行上述程序,但为同一程序提供了不同的值。对于给定的字符串执行多次时,是否有任何方法可以获取相同的字节? 问题答案: 在这里,您不打印a的值。正如owlstead在注释中正确指出的那样,将在字节数组上调用Object.toString()方法。导致这种格式的输出: 如果要打印数组中的每个元素,则必须遍历它。 甚至更简单,请使用以下方法:

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

  • 问题内容: 让我们考虑下表- 我是一个SQL新手,但是如何返回同时包含ID 2和ID 4的分数?因此,由于ID 2和ID 4中均包含该字符,因此应该返回100 问题答案: 这是“组内集”查询的示例。我建议使用该子句进行聚合,因为这是最灵活的方法。 这是在按分数汇总。然后,子句()的第一部分是计算每个分数有多少个“ 2”。第二个是计算多少个“ 4”。仅返回分数为“ 2”和“ 4”的分数。

  • 问题内容: 我有2个带有通用列/键(x,y)的熊猫数据框df1和df2。 我想对键(x,y)进行“(df1&not df2)”合并,这意味着我希望我的代码返回仅包含df1中而不包含df2中包含(x,y)行的数据框。 SAS具有等效功能 谁能优雅地在熊猫中复制相同的功能?如果我们可以在merge()中指定how =“ left-right”,那就太好了。 问题答案: 我刚刚升级到10天前发布的版本0

  • 问题内容: 在Pandas DataFrame中,我可以使用函数将列值与另一列进行匹配。 例如:假设我们有一个DataFrame: 和另一个DataFrame: 我可以使用的功能相匹配的列值对的列值 例如: 产量: PySpark DataFrame中的等效操作是什么? 上面的代码给我一条错误消息: 问题答案: 这种操作在spark中称为“左半联接”: