【问题标题】:Using lapply with mutate in R [duplicate]在 R 中使用 lapply 和 mutate [重复]
【发布时间】:2018-12-15 03:04:54
【问题描述】:

我无法将一些代码放入函数/在 R 中运行循环

我想根据 'var99' 列中的值替换数据框中的变量 (var1,2,3,4)。

我可以通过以下方式做到这一点:

var1 =  c(1, 2, 1, 2)
var2 = c(3, 2, 1, 2)
var3 = c(0.4, 2, 1, 2)
var4 = c(1, 2, 1, 2)
n1 = c(10, 14, 12, 10)
n2 = c(5, 3, 12, 10)
var99 = c('se', 'se', 'sd', 'sd')
mydata=data.frame(var1, var2, var3, var4, n1, n2, var99)    
mydata<- mutate(mydata, var1 = ifelse(var99=="se",(var1*n1^0.5), var1))

mydata<- mutate(mydata, var2 = ifelse(var99=="se",(var2*n2^0.5), var2))

mydata<- mutate(mydata, var3 = ifelse(var99=="se", (var3*n2^0.5), var3))

mydata<- mutate(mydata, var4 = ifelse(var99=="se", (var4*n2^0.5), var4))

但这会因为更多的变量而变得笨拙,我更愿意拥有例如

varnames = c(var1, var2, var3, var4)

然后我会循环播放。任何人都可以建议如何构建一个函数/使用 lapply,因为我的尝试没有成功

【问题讨论】:

  • 请分享一个可重现的例子
  • 也许检查mutate_at 以将您的函数应用于多个列。在没有任何数据的情况下提供更多帮助并不容易。
  • 我在上面添加了一个可重现的例子
  • 您不需要遍历变量,但您还必须检查您需要使用n1n2 的变量,对吗?只要确保这不是打字错误。
  • 是的,抱歉,这不清楚;有时是n1,有时是n2。但我想如果我有一个可行的解决方案,我会很乐意用 n1 运行它两次,另一次用 n2 运行它。

标签: r loops lapply dplyr


【解决方案1】:

我希望以下示例可以帮助您选择最适合您的目标的方法

var1 =  c(1, 2, 1, 2)
var2 = c(3, 2, 1, 2)
var3 = c(0.4, 2, 1, 2)
var4 = c(1, 2, 1, 2)
n1 = c(10, 14, 12, 10)
n2 = c(5, 3, 12, 10)
var99 = c('se', 'se', 'sd', 'sd')
mydata=data.frame(var1, var2, var3, var4, n1, n2, var99)

library(dplyr)

# applying one function to those specific 4 columns
mydata %>% mutate_at(vars(var1:var4), funs(ifelse(var99=="se",(.*n2^0.5), .)))

#       var1     var2      var3     var4 n1 n2 var99
# 1 2.236068 6.708204 0.8944272 2.236068 10  5    se
# 2 3.464102 3.464102 3.4641016 3.464102 14  3    se
# 3 1.000000 1.000000 1.0000000 1.000000 12 12    sd
# 4 2.000000 2.000000 2.0000000 2.000000 10 10    sd


# applying different functions to different columns
mydata %>% 
  mutate_at(vars(var1), funs(ifelse(var99=="se",(.*n1^0.5), .))) %>%
  mutate_at(vars(var2:var4), funs(ifelse(var99=="se",(.*n2^0.5), .)))

#       var1     var2      var3     var4 n1 n2 var99
# 1 3.162278 6.708204 0.8944272 2.236068 10  5    se
# 2 7.483315 3.464102 3.4641016 3.464102 14  3    se
# 3 1.000000 1.000000 1.0000000 1.000000 12 12    sd
# 4 2.000000 2.000000 2.0000000 2.000000 10 10    sd


# applying different functions to those specific 4 columns

mydata %>% 
   mutate_at(vars(var1:var4), funs(n1 = ifelse(var99=="se",(.*n1^0.5), .), 
                                   n2 = ifelse(var99=="se",(.*n2^0.5), .)))

#   var1 var2 var3 var4 n1 n2 var99  var1_n1  var2_n1  var3_n1  var4_n1  var1_n2  var2_n2   var3_n2  var4_n2
# 1    1    3  0.4    1 10  5    se 3.162278 9.486833 1.264911 3.162278 2.236068 6.708204 0.8944272 2.236068
# 2    2    2  2.0    2 14  3    se 7.483315 7.483315 7.483315 7.483315 3.464102 3.464102 3.4641016 3.464102
# 3    1    1  1.0    1 12 12    sd 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.0000000 1.000000
# 4    2    2  2.0    2 10 10    sd 2.000000 2.000000 2.000000 2.000000 2.000000 2.000000 2.0000000 2.000000

【讨论】:

  • 对于最后一个示例,您可以通过调用 mutate_at 来完成,如下所示:mydata %&gt;% mutate_at(vars(var1:var4), funs(n1 = ifelse(var99=="se",(.*n1^0.5), .), n2 = ifelse(var99=="se",(.*n2^0.5), .)))
  • 好点!我会更新我的答案。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 2020-03-12
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多