【问题标题】:How to combine for loop with function I made in R如何将for循环与我在R中制作的函数结合起来
【发布时间】:2020-03-13 07:25:22
【问题描述】:

如何将 for 循环与我在 R 中制作的函数结合起来? ,并想在 satis.list 中循环。但是,它无法循环..

我在下面创建了一个函数“site_table”。

> satis.list <- paste0("s1_", 1:19)
> satis.list <- c(satis.list,"s2","s3","s4")
> satis.list
 [1] "s1_1"  "s1_2"  "s1_3"  "s1_4"  "s1_5"  "s1_6"  "s1_7"  "s1_8"  "s1_9" 
[10] "s1_10" "s1_11" "s1_12" "s1_13" "s1_14" "s1_15" "s1_16" "s1_17" "s1_18"
[19] "s1_19" "s2"    "s3"    "s4"   

并在下面创建一个函数site_table。

> site_table = function(var){
+   var_name <- eval(substitute(var),eval(work.data))
+   a <- table(var_name,work.data$site)
+   b.list <- list(a[2,1], a[2,2], a[2,3])
+   b.data <- data.frame(t(b.list))
+   b.data
+ }

我想像下面那样在 satis.list 中从“s1_1”到“s4”重复这个

> site_table(s1_1)
  X1 X2 X3
1  2  2  7
> site_table(s1_2)
  X1 X2 X3
1  2  3  4
> site_table(s1_3)
  X1 X2 X3
1  3  1  4

我尝试使用此代码但失败了。

> c.data <- data.frame()
> for(i in satis.list){
+   site_table(i)
+   c.data <- rbind(c.data, b.data)
+ }
 Error in table(var_name, work.data$site) : 
  all arguments must have the same length 

这是我最后想要做的输出。

  Row.names X1 X2 X3
1    s1_1    2  2  7
1    s1_2    2  3  4
1    s1_3    3  1  4

【问题讨论】:

  • 似乎缺少一些数据来重现您的示例。变量work.data 是什么?无论如何,您需要在循环中写入b.data &lt;- site_table(i)。函数本身不返回变量b.data(即函数内的局部变量)。
  • 嗨。除了缺少数据(请参阅stackoverflow.com/questions/5963269/… 了解如何制作一个良好的可重现示例)之外,您的代码还有几个问题。您得到的错误与以下事实有关:在行中的 site_table() `a 1 的向量表化。尝试你自己和table("var", mtcars$mpg)
  • 像这样运行你的函数:site_table(s2) 并告诉我结果是什么
  • @M.Papenberg 很抱歉缺少数据。 example.data &lt;- data.frame( site = c(1,1,1,2,2,2,3,3,3), s1_1 = c(NA,NA,NA,1,NA,NA,1,1,NA), s1_2 = c(1,NA,NA,1,1,NA,1,1,1), s1_3 = c(1,1,1,1,1,NA,1,NA,NA) )
  • @stefan 嗯,我想像下面这样重复。 table(work.data$s1_1,work.data$site) table(work.data$s1_2,work.data$site) ... repeat in satis.list from "s1_1" to "s4" 此代码运行,并且函数“site_table”也像site_table(s1_1)、site_table(s1_2) 一样单独运行。但是,当我放入循环时,出现错误。

标签: r function for-loop


【解决方案1】:

如果我没听错的话。您需要一个表格,显示每个站点的“1”数量以及满足列表的每个“元素”。以下方法首先将数据转换为长格式,过滤掉缺失,然后将站点与原始数据集中的其他列进行对比。试试这个:

library(dplyr)
library(tidyr)

example.data <- data.frame( site = c(1,1,1,2,2,2,3,3,3), s1_1 = c(NA,NA,NA,1,NA,NA,1,1,NA), s1_2 = c(1,NA,NA,1,1,NA,1,1,1), s1_3 = c(1,1,1,1,1,NA,1,NA,NA) )

example.data
#>   site s1_1 s1_2 s1_3
#> 1    1   NA    1    1
#> 2    1   NA   NA    1
#> 3    1   NA   NA    1
#> 4    2    1    1    1
#> 5    2   NA    1    1
#> 6    2   NA   NA   NA
#> 7    3    1    1    1
#> 8    3    1    1   NA
#> 9    3   NA    1   NA

# Using gather 
example.data %>% 
  gather(satis.list, value, -site) %>% 
  filter(!is.na(value)) %>% 
  select(satis.list, site) %>% 
  table()
#>           site
#> satis.list 1 2 3
#>       s1_1 0 1 2
#>       s1_2 1 2 3
#>       s1_3 3 2 1

reprex package (v0.3.0) 于 2020 年 3 月 16 日创建

【讨论】:

    猜你喜欢
    • 2012-09-16
    • 2015-08-12
    • 2021-09-18
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 2014-09-08
    相关资源
    最近更新 更多