如何将for循环与我在R中创建的函数结合在一起

问题描述 投票:0回答:1

如何将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
r function for-loop
1个回答
0
投票

如果我说对了,您需要一个表,以显示每个站点和饱和度列表的每个“元素”的“ 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-03-16创建

© www.soinside.com 2019 - 2024. All rights reserved.