Как совместить для l oop с функцией, которую я сделал в R - PullRequest
0 голосов
/ 13 марта 2020

Как объединить для l oop с функцией, которую я сделал в R? и хочу l oop в списке Однако это не удалось l oop ..

Я сделал функцию '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" в списке соответствия. 1009 *

> 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

1 Ответ

0 голосов
/ 16 марта 2020

Если я правильно понял. Вы хотите таблицу, которая показывает количество «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

Создано в 2020-03-16 пакетом Представлять (v0.3.0)

...