這是我的示例資料框:
data <- data.frame(matrix(NA, nrow = 5, ncol = 2))
colnames(data) <- c("Variables", "Value")
Xs <- combn(c("X1", "X2", "X3", "X4", "X5", "X6"), 4, simplify = FALSE)
for(j in 1:5)
{
data$Variables[j] <- Xs[j]
data$Value[j] <- sin(j)
}
看起來像這樣:
Variables Value
1 X1, X2, X3, X4 0.8414710
2 X1, X2, X3, X5 0.9092974
3 X1, X2, X3, X6 0.1411200
4 X1, X2, X4, X5 -0.7568025
5 X1, X2, X4, X6 -0.9589243
其中 column 的元素Variables是串列:
typeof(data$Variables[1])
[1] "list"
現在,我有第二個資料框:
vals <- data.frame(matrix(NA, nrow = 6, ncol = 2))
colnames(vals) <- c("Variable", "Val")
for(j in 1:6)
{
vals$Variable[j] <- paste0("X", j, sep = "")
vals$Val[j] <- cos(j)
}
這是輸出:
Variable Val
1 X1 0.5403023
2 X2 -0.4161468
3 X3 -0.9899925
4 X4 -0.6536436
5 X5 0.2836622
6 X6 0.9601703
我的問題是:我想以data這樣的方式創建我的資料框的另一列,即第一行data:
Variables Value
1 X1, X2, X3, X4 0.8414710
我sum根據以下值應用(或平均值、最小值、最大值、加權平均值)函式vals:
X1, X2, X3, X4 -> 0.5403023 - 0.4161468 - 0.9899925 - 0.6536436 = -1.5194806
它會產生一個新列data:
Variables Value Sum
1 X1, X2, X3, X4 0.8414710 -1.5194806
這甚至可能嗎?
uj5u.com熱心網友回復:
是的,你可以這樣做:
data$Sum <- sapply(data$Variables, function(x) sum(vals$Val[match(x, vals$Variable)]))
data
#> Variables Value Sum
#> 1 X1, X2, X3, X4 0.8414710 -1.51948065
#> 2 X1, X2, X3, X5 0.9092974 -0.58217484
#> 3 X1, X2, X3, X6 0.1411200 0.09433326
#> 4 X1, X2, X4, X5 -0.7568025 -0.24582597
#> 5 X1, X2, X4, X6 -0.9589243 0.43068214
uj5u.com熱心網友回復:
或者tidyverse通過從 'vals' 創建一個命名向量 ( deframe) 來匹配 'Variable' 的元素并獲得sum
library(dplyr)
library(tibble)
library(purrr)
data %>%
mutate(Sum = map_dbl(Variables, ~ sum(deframe(vals)[.x])))
Variables Value Sum
1 X1, X2, X3, X4 0.8414710 -1.51948065
2 X1, X2, X3, X5 0.9092974 -0.58217484
3 X1, X2, X3, X6 0.1411200 0.09433326
4 X1, X2, X4, X5 -0.7568025 -0.24582597
5 X1, X2, X4, X6 -0.9589243 0.43068214
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/444468.html
下一篇:根據列匹配回傳其他行中存在的值
