我正在查看一个名为combinedpred的数据帧,如果该行包含某个值,则将乘数应用于同一行特定列中的另一个值。
我认为最好的方法是通过在数据帧中运行for循环,然后使用if语句检查该值是否存在,然后执行其他操作以在同一列中执行其他操作行。
例如:
数据框组合pred:
monday | Tuesday | Wednesday | Thurday | class
0.99 | 0.2643 | 0.234 | 0.22343 | Maths
0.32 | 0.2123 | 0.22 | 0.63 | Science
0.233 | 0.6423 | 0.24 | 0.73 | English
我认为代码将如下所示:
for(i in 1:nrow(combinedpred)) {
if (conbinedpred[i] %in% 'class'){
combinedpred[i,"Maths"] * 1.5
} if (conbinedpred[i] %in% 'class') {
combinedpred[i,"English"| "science"] * 1.9
} if (conbinedpred[i] %in% 'class') {
combinedpred[i,"history"] * 1.1
}
}
结果:
由于第一列中包含数学运算,因此将1.5乘数应用于第一列,但仅适用于该行。我只是通过上面的例子才意识到这是错误的。
答案 0 :(得分:1)
这就是您想要的。将整个行与基于class
的正确乘数相乘。
lookupTable <- c(Maths = 1.5, Science= 1.9, English= 1.9, History = 1.1)
df1$multipl <- lookupTable[df1$class]
df1[,1:4] <- df1[,1:4] * df1$multipl
df1 <-
structure(list(monday = c(0.99, 0.32, 0.233), Tuesday = c(0.2643,
0.2123, 0.6423), Wednesday = c(0.234, 0.22, 0.24), Thurday = c(0.22343,
0.63, 0.73), class = c("Maths", "Science", "English")), row.names = c(NA,
-3L), class = "data.frame")
答案 1 :(得分:0)
循环不是最佳选择,您应该尝试以下操作:
conbinepred$monday <- ifelse(conbinepred$class=="Maths", conbinepred$monday*1.5, ifelse(conbinepred$class=="Science", conbinepred$monday*1.9, conbinepred$monday*1.1))
答案 2 :(得分:0)
使用dplyr
可能会更简洁,更快捷地运行并键入:
library(dplyr)
df <- data.frame(
x = as.character(LETTERS[1:10]),
y = 1:10
)
df %>%
mutate(
y = ifelse(x == "D", y * 100, y)
)
还有一种dplyr
的另一种方法,可能是添加一个包含乘数的列。
df <- data.frame(
x = as.character(LETTERS[1:3]),
y = 1:3,
z = runif(3),
multipliers = c(5, .3, .2)
)
df %>%
mutate(
y = y * multipliers, # multiply
z = z * multipliers
) %>%
select(-multipliers) # remove multipliers
下面是一个完整的解决方案:创建一个data.frame,其中包含每个类别各自的乘数,将它们合并然后相乘。更干净,更快,更易于维护。
multipliers <- data.frame(
class = LETTERS[1:3],
multiplier = c(.3, 5, 100)
)
df <- data.frame(
class = sample(LETTERS[1:3], 100, replace = TRUE),
x = runif(100),
y = runif(100)
)
df %>%
left_join(multipliers, by = "class") %>%
mutate(
x = x * multiplier,
y = y * multiplier
) %>%
select(-multiplier)