我想要的是,通过选择
仅有限数量的列,在我的数据框中创建一个新列,其值是每行最大值的列名称。
我总共有 44 列,我想要从位置 7 到 29 的列范围,以及一些特定的列。因此,我不仅想要执行 7:29 的范围,还想要选择名为“A”和“B”的列(例如)。有人知道我该怎么做吗?我已尝试使用其他答案中给出的代码,但它们不起作用。我试过:
cdmx <- cdmx %>%
+ mutate(winner = names(cdmx)[max.col(cdmx[, c(7:29, "coal_pri_pvem", "coal_prd_pt_nva_alianza", "coal_prd_pt")], ties.method = "first")])
但是发生了这个错误(即使我总共有 44 列):
Error in `mutate()`:
ℹ In argument: `winner = ...[]`.
ℹ In row 1.
Caused by error in `cdmx[, c(7:29, "coal_pri_pvem",
"coal_prd_pt_nva_alianza", "coal_prd_pt")]`:
! Can't subset columns that don't exist.
✖ Columns `7`, `8`, `9`, `10`, `11`, etc. don't exist.
我也尝试过以下代码:
cdmx$winner <- colnames(cdmx)[apply(cdmx[, c(7:num_columnas, "coal_pri_pvem", "coal_prd_pt_nva_alianza", "coal_prd_pt")], 1, function(x) which.max(x, na.rm = TRUE))]
然而同样的错误发生了:
Error in cdmx[, c(7:29, "coal_pri_pvem",
"coal_prd_pt_nva_alianza", "coal_prd_pt")]:
! Can't subset columns that don't exist.
✖ Columns 7, 8, 9, 10, 11, etc. don't exist.
我查了很多网站,但没有找到解决方案。有人知道我该如何解决这个问题吗?谢谢!
首先,您不能使用索引
和 名称对数据帧进行子集化,您必须选择其中一种方法。
您可以执行mtcars[, c(3:6)]
或
mtcars[, c("gear", "hp")]
但不能混合使用两者,即
mtcars[, c(3:6, "gear", "hp")]
会返回错误。所以就你而言,
cdmx[, c(7:29, "coal_pri_pvem", "coal_prd_pt_nva_alianza", "coal_prd_pt")]
是不正确的。如果您无法对这些列的列号进行硬编码,您可以使用
match
找到它们。其次,您应该仅对您选择的那些列名称进行子集化。在您的代码中,您正在子集整个
colnames(cdmx)
或
names(cdmx)
。尝试以下方法 -
cols <- c("coal_pri_pvem", "coal_prd_pt_nva_alianza", "coal_prd_pt")
col_index <- match(cols, names(cdmx))
all_index <- c(7:29, col_index)
cdmx$winner <- names(cdmx)[max.col(cdmx[, all_index], ties.method = "first")]