【问题标题】:Function indexing dataset and variable of interest函数索引数据集和感兴趣的变量
【发布时间】:2020-01-22 19:36:45
【问题描述】:

我刚开始学习编程,我有一个问题对你来说可能很容易。 我有一个看起来像这样的数据集

df <- data.frame(id= c(1,1,1,2,2,2,3,3,3), time=c(1,2,3,1,2,3,1,2,3),y = rnorm(9), x1 = LETTERS[seq( from = 1, to = 9 )], x2 = c(0,0,0,0,1,0,1,1,1),c2 = rnorm(9))
df
#    id time     y      x1 x2     c2
# 1  1    1  0.6364831  A  0 -0.066480473
# 2  1    2  0.4476390  B  0  0.161372575
# 3  1    3  1.5113458  C  0  0.343956178
# 4  2    1  0.3532957  D  0  0.279987147
# 5  2    2  0.3401402  E  1 -0.462635393
# 6  2    3 -0.3160222  F  0  0.338454940
# 7  3    1 -1.3797158  G  1 -0.621169576
# 8  3    2  1.4026640  H  1 -0.005690801
# 9  3    3  0.2958363  I  1 -0.176488132

我正在编写一个包含多个步骤的函数。我想为函数提供数据集和感兴趣的变量这两个元素。

但是,当我尝试 dcast 时,该函数会崩溃,因为它无法对变量进行个体化。该函数的关键步骤如下所示。

testfun<-function(df,var)
{
newdf <- dcast(dataset,id+time~ x1, value.var = var) %>%  # note this should be the variable of interest that i feed into the function 
distinct()
return(newdf)
}
df2<-testfun(df,y)

谁能帮我解释一下如何创建一个函数来索引数据集和函数?

提前感谢您的帮助

【问题讨论】:

  • 您确定您正确使用dcast 吗?您对newdf 的预期输出是什么?你如何在函数 dcast(dataset,id+time~ x1, value.var = var) 之外运行它?
  • 由于您使用的是 dplyr,请使用相应的 tidyr 函数而不是 dcast。这允许您传入变量。
  • 因为这个dcast只是一个更复杂的函数中的一个步骤。我需要将其应用于多个数据集和多个变量,因此我想编写一个函数一次执行所有操作以使脚本更清晰。 @RonakShah
  • @KonradRudolph,我更喜欢使用 dcast,因为它是一个非常大的数据集,而且速度更快。但是 dplyr 命令会产生相同的输出吗?
  • 您真的希望您的数据看起来像这样吗? dcast(df,id+time~ x1, value.var = "y")

标签: r function


【解决方案1】:

如果您将列名作为字符串传递,则函数将按原样工作

library(tidyverse)
library(data.table)

testfun1<-function(df,var) {    
  newdf <- dcast(df,id+time~ x1, value.var = var) %>% distinct()
  return(newdf)
}

testfun1(df, "y")

但是,如果您想将不带引号的变量作为输入传递,您可以使用

testfun2<-function(df,var) {
  var1 <- deparse(substitute(var))
  newdf <- dcast(df,id+time~ x1, value.var = var1) %>% distinct()
  return(newdf)
}

testfun2(df, y)

@Konrad Rudolph 提到的等效 tidyr 函数是 pivot_wider,它适用于两种类型的输入。

testfun3 <-function(df,var) {
    new_df <- pivot_wider(df, names_from = x1, values_from = y)
    return(new_df)
}
testfun3(df, y)
testfun3(df, "y")

【讨论】:

  • 对不起,我有一个后续问题。函数的另一行是这样的 testfun2(dataset,var){step&lt;-unique(setDT(dataset)[var==1 &amp; c2&gt;0,.(x1)])} 这次将列名作为字符串传递似乎不起作用。 ` as testfun(df, "x2") 不起作用....你知道在这种情况下如何识别变量吗?
  • 是的,搜索非标准评价。如何传递变量通常取决于你想做什么 l.可能在这里使用get 会有所帮助。
猜你喜欢
  • 2017-09-17
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2012-02-22
  • 2018-10-06
相关资源
最近更新 更多