如何将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创建