gpt4 book ai didi

r - 当列名等于行值时,结合两个数据框来计算变量

转载 作者:行者123 更新时间:2023-12-04 20:27:59 24 4
gpt4 key购买 nike

我有两个数据框:一个数据框具有表示是否存在字符串匹配的二分变量,第二个数据框为该字符串跨不同维度应用“权重”。

例如,df1可能看起来像这样:

organic    gluten_free    kosher   sugar_free
1 0 0 0
1 1 0 1
1 1 0 1
0 0 1 0
1 0 1 0

行值 在第二个数据框中( df2 )应该匹配 df1 中列名的值,每行中的值代表一个权重。
attribute    eco-friendly     healthy 
organic 2 3
gluten_free 1 4
kosher 3 3
sugar_free 2 3

然后我想计算 df1 中每行值的权重乘积当 colnamedf1等于 df2 中的行值成单独的索引。为清楚起见,我包含了 eco-friendly 的具体计算索引如下:
organic    gluten_free    kosher   sugar-free  eco-friendly
1 0 0 0 (1*2 + 0*1 + 0*3 + 0*2)
1 1 0 1 (1*2 + 1*1 + 0*3 + 1*2)
1 1 0 1 (1*2 + 1*1 + 0*3 + 1*2)
0 0 1 0 (0*2 + 0*1 + 1*3 + 0*2)
1 0 1 0 (1*2 + 0*1 + 1*3 + 0*2)

我编写了一个非常丑陋且缓慢的循环函数来完成此任务,但我相信存在更优雅的解决方案。下面是一些额外的示例数据。
> dput(df1[1:100,]) 
structure(list(organic = c("0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"), gluten_free = c("0", "1", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "1", "1", "1", "1", "1", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "1", "0", "1", "1", "1", "1", "1", "1", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "1", "0", "0", "0", "0", "0", "1", "0", "1", "0"), kosher = c("0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "0", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "0", "1", "1", "1", "0", "1", "1", "0", "1", "1", "1", "1", "1", "1", "1", "0", "0", "1", "1", "0", "0", "1", "0", "0", "0", "1")), row.names = c("2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "15", "17", "18", "19", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "77", "78", "79", "80", "81", "83", "84", "85", "86", "87", "88", "91", "92", "93", "95", "97", "98", "101", "103", "105", "106", "108", "117", "124", "125", "127", "129", "131", "132", "133", "136", "137"), class = "data.frame")

> dput(df2[1:3,])
structure(list(attribute = c("organic", "gluten_free", "kosher"), eco_friendly = c(1L, 3L, 2L), healthy = c(2L, 0L, 1L)), row.names = 1:3, class = "data.frame")

最佳答案

我们可以取两者的点积df s,请记住 %*%运算符仅适用于数字矩阵:

df1[] <- lapply(df1, as.numeric)
output <- cbind(df1, as.matrix(df1) %*% as.matrix(df2[,-1]))

这样做的缺点是 df1 中的列和 df2 中的行必须按正确的顺序排列。为了确保列和行顺序匹配,我们可以使用以下内容代替 df2[,-1] :
df2[match(names(df1), df2$attribute),-1]
输出:
> head(output)
organic gluten_free kosher eco_friendly healthy
2 0 0 0 0 0
3 0 1 0 3 0
4 0 0 0 0 0
5 0 0 0 0 0
6 0 1 0 3 0
7 0 0 0 0 0

关于r - 当列名等于行值时,结合两个数据框来计算变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53820861/

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