【问题标题】:R Error: Multi-argument returns are not permitted, but there is no multi-argumentR错误:不允许多参数返回,但没有多参数
【发布时间】:2020-04-03 00:40:25
【问题描述】:

因此,我的任务是帮助我在研究实验室的 PI 提出一个简单的函数,以帮助从数据框中选择两个随机值,同时忽略 NA。我们工作有价值的数据是基于自我报告的数据,所以我们有一些地方没有回答,我们得到了 NA。我们不会放弃我们的 NA,但在对子量表进行分析时,我们确实需要选择一些值,同时忽略 NA。

我制作了一个简单的测试数据框,并开始使用我的测试功能。我知道它不会像我需要的那样工作,但我遇到了一个奇怪的错误。这是我的代码。

rm(list = ls())                   ### clear all ###
dev.off(dev.list()["RStudioGD"])
options(scipen=999)

install.package("dplylr")
install.package("magrittr")
library("magrittr")
library("dplyr")

df<- data.frame("Var1"=c(1,7,8), "Var2"=c(NA, NA, 9), "Var3"=c(2, NA,10), "Var4"=c(3,5,NA), "Var5"=c(4,7,NA))

#select columns funciton, picks two random values from data frame not containing NA
select.col <- function(x,y) ##given df x select y columns
  df %>% 
    select_if(is.numeric) %>%
    return(z)

b <- select.col(df,2)

所以,我正在尝试创建一个函数,该函数从未选择 NA 的每一行中选择第二个参数作为随机列。

我希望 b 成为一个新数据集,并以这种格式包含这些数据:


1, 2
2, 7
3, 9

(基本上我的数据是在没有 NA 的情况下随机选择的……有点像基本的 x,y/输入输出表)

我遇到了这个问题,无论我如何重写这个函数,我都会得到“不允许多参数返回”的相同错误。

有什么想法或建议吗?

编辑:我修复了我希望数据外观的格式。把它想象成 CSV;所以一列是一个值,另一列是另一个值。

【问题讨论】:

  • 什么是 z?我想你只是想要%&gt;% return()
  • 完美。这解决了这个最初的问题。
  • 抱歉,格式错误。我现在会在编辑中修复它。

标签: r function dataframe


【解决方案1】:

当你写作时

df %>% 
select_if(is.numeric) %>%
return(z)

和

一样
return(select_if(df, is.numeric), z)

return 不接受两个参数,这就是您收到错误消息的原因。另外,请注意您的 return 语句使用 z,但 z 没有在任何地方定义。

【讨论】:

    【解决方案2】:

    你需要这样的东西吗?

    select.col <- function(x,y) {
       nc <- y
       nr <- nrow(df)
    
       df %>%
         #select only numeric columns
         select_if(is.numeric) %>%
         #Convert data into a vector
         unlist %>%
         #Remove NA values
         na.omit %>%
         Select random nc * nr values
         sample(nc * nr) %>%
         #Convert it into matrix specifying number of rows and columns
         matrix(ncol = nc, nrow = nr) %>%
         #Convert into dataframe
         as.data.frame()
    } 
    
    select.col(df,2)
    
    #  V1 V2
    #1  5  1
    #2  3 10
    #3  8  2
    

    【讨论】:

    • 哇,是的,我没想到会有如此深入和完整的答案。该函数在每个步骤中究竟做了什么?是否将数据框转换为矩阵,然后排除 NA?当我昨天写自己的时候,我正在玩弄它,但它看起来比这更混乱。感谢您的帮助!
    • @AlexSmith 我在答案中添加了一些解释作为 cmets。
    • 非常感谢!在我正在编写的一个脚本中(没有在此处发布)我尝试自己使用 na.omit 但忽略了将我的数据转换为向量。使用 na.omit 基本上只是从数据框中“清除”了数据,它说没有值。我是否正确理解当数据列在数据框中时无法删除 NA?
    • 是的,na.omit 在数据框中删除整行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多