首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时使用'apply‘和'recode’

同时使用'apply‘和'recode’
EN

Stack Overflow用户
提问于 2021-11-26 16:42:20
回答 2查看 39关注 0票数 0

我需要重新创建一些变量,但是我没有使用for循环,而是尝试使用带有'recode‘函数的'apply’函数。

下面是我到目前为止已经尝试过的一些代码。

vars <- c("var","var2","var3","var4","var5")

recode_vars <- apply(recode(mydata,vars,"lo:129=0;130:hi=1"))

但是,这会产生错误消息: error in match.fun(FUN):缺少参数"FUN“,没有默认值。

有人知道我该怎么解决这个问题吗?或者只是如何在一般情况下一起使用‘应用’和‘重新编码’?

EN

回答 2

Stack Overflow用户

发布于 2021-11-26 16:50:28

我们可以在across中使用recode

代码语言:javascript
复制
library(dplyr)
vars <- c("var1", "var2", "var3", "var4", "var5")
mydata %>%
   mutate(across(all_of(vars), ~ recode(., "lo:129" = 0, "130:hi" = 1)))

-output

代码语言:javascript
复制
   var1 var2 var3 var4 var5
1    0    1    1    1    1
2    0    0    1    0    0
3    1    0    1    1    0
4    0    1    0    0    1

或者,如果我们需要使用apply,则指定MARGIN以在列之间循环-2

代码语言:javascript
复制
mydata[vars] <- apply(mydata[vars], MARGIN = 2, 
     function(x) recode(x, "lo:129" = 0, "130:hi" = 1))

数据

代码语言:javascript
复制
set.seed(24)
mydata <- as.data.frame(matrix(sample(c("lo:129", "130:hi"), 4 * 5, 
   replace = TRUE), ncol = 5, dimnames = list(NULL, paste0("var", 1:5))))
票数 0
EN

Stack Overflow用户

发布于 2021-11-26 19:30:13

当您似乎希望保留129到130之间的值并将所有其他值标记为低(0)或高(1)时,Recode会将特定值映射到其他特定值。从你的例子中很难判断,因为输入是否是整数是不确定的。您可以使用if-then或case_when逻辑轻松完成此操作。这里有一个快速的解决方案,可以让你上手。

代码语言:javascript
复制
library(purrr)
df <- data.frame(var1=runif(10, min = 128, max = 131), 
                 var2=runif(10, min = 128, max = 131))

n  <- df %>% map_dfc(~ case_when(. <= 129 ~ 0, . >= 130 ~ 1, T ~ .))

如果输入都是整数,您可以简单地删除case_when语句中的最后一个子句,因为它永远不会为真。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70127586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档