我在R中有一个数据帧,该数据帧宽89列,长500,000行。每列中都有多个4位数字代码,它们可以位于任何列中。我想创建一个扫描每一行以查看代码是否存在的函数,如果它的标签为1或0,则必须将新列命名为所搜索的代码或非常相似的名称(附加字母等),然后冲洗并重复约450个这样的代码。每个新列都将在要搜索的代码之后以某种方式标记,例如下面的3669列。
c1 c2 c3 3369
1 2255 3669 NA 1
2 NA 5555 6598 0
3 NA NA 1245 0
我试图使用mutate来做到这一点,并且rowSums见下文,该方法适用于单个代码,但是使用sapply函数时我无法工作。它只是创建一个称为“ x”的列
a <- function(x) {
SR2 <<- SR2 %>% mutate(x = ifelse(rowSums(SR2 == x, na.rm = TRUE) > 0, 1, 0))
}
此功能中的x是代码列表,因此“ 3369”,“ 2255”等。
我在这里想念什么?
答案 0 :(得分:1)
使用quo_name
和!!
来获取正确的列名。使用map_dfc
获取数据帧中的输出
library(purrr)
library(dplyr)
df_out <- map_dfc(c('2255','5555'),
~transmute(df,!!quo_name(.x) := ifelse(rowSums(df == .x, na.rm = TRUE) > 0, 1, 0)))
bind_cols(df,df_out)
数据
df <- structure(list(c1 = c(2255L, NA, NA), c2 = c(3669L, 5555L, NA), c3 = c(NA, 6598L, 1245L),
`3369` = c(1L, 0L, 0L)), class = "data.frame", row.names = c("1", "2", "3"))