这个问题类似于我在这里发现的:将一个数据框中的行(带有行名)与另一个数据框中匹配的列名相乘
但是不是匹配行和乘法,我想将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中索引的理解。
世界上功能较少的程序:
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
将< 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中称为“左半联接”: