如何将for循环与我在R中制作的函数相结合



如何将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
+ }

我想像下面一样重复这一点,从"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

如果我说对了。你需要一个表格,显示每个站点和satis列表中每个"元素"的"1"的数量。以下方法首先将数据转换为长fomrat,过滤掉遗漏的数据,然后将site与原始数据集中的其他列进行比较。试试这个:

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包(v0.3.0(于2020-03-16创建

最新更新