【发布时间】: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 <- site_table(i)。函数本身不返回变量b.data(即函数内的局部变量)。 -
嗨。除了缺少数据(请参阅stackoverflow.com/questions/5963269/… 了解如何制作一个良好的可重现示例)之外,您的代码还有几个问题。您得到的错误与以下事实有关:在行中的
site_table()`a 1 的向量表化。尝试你自己和table("var", mtcars$mpg)。 -
像这样运行你的函数:
site_table(s2)并告诉我结果是什么 -
@M.Papenberg 很抱歉缺少数据。
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) ) -
@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) 一样单独运行。但是,当我放入循环时,出现错误。