как получить общее количество переменной в каждой строке - PullRequest
0 голосов
/ 01 июня 2018

У меня есть фрейм данных, как показано ниже: sp

Join      p1     sp1       p2      sp2     p3      sp3
  1          0        0           0         0        0          0
   2          1        pine     0         0       1         Aspen
   3           2        pine     0        0       0          0

И фрейм данных продолжается 100 строками, где p1 - количество видов, указанное в столбце sp1 и так далее.Теперь я хочу создать новую переменную сосну, которая подсчитывает общее количество видов сосны в каждой строке (объединение)

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Вы можете конвертировать ваши данные в длинном формате для выполнения расчетов.Если данные представлены в длинном формате, fuzzyjoin::regex_inner_join позволит объединить данные для парных значений (например, p1 vs sp1).

Опцией использования tidyverse может быть:

library(tidyverse)
library(fuzzyjoin)         

#To calculate count of Species per row for different type

df %>% gather(Species, value, -Join) %>% 
  mutate(Join = as.character(Join))  %>% {
    regex_inner_join(filter(., grepl("^s",Species)),
              filter(.,grepl("^p",Species)),
              by = c("Join", "Species"))
} %>%
  filter(value.x != "0") %>%
  group_by(Join.x, value.x) %>%
  summarise(count = sum(as.numeric(value.y))) %>% as.data.frame()

#   Join.x value.x count
# 1      2   Aspen     1
# 2      2    pine     1
# 3      3    pine     2

#To calculate count of Species per row 
df %>% gather(Species, value, -Join) %>% 
  mutate(Join = as.character(Join))  %>% {
    regex_inner_join(filter(., grepl("^s",Species)),
              filter(.,grepl("^p",Species)),
              by = c("Join", "Species"))
} %>%
group_by(Join.x) %>%
summarise(count = sum(as.numeric(value.y))) %>% as.data.frame()

#   Join.x count
# 1      1     0
# 2      2     2
# 3      3     2

Данные:

df <- read.table(text = 
"Join      p1     sp1       p2      sp2     p3      sp3
1          0        0           0         0        0          0
2          1        pine     0         0       1         Aspen
3           2        pine     0        0       0          0",
header = TRUE, stringsAsFactors = FALSE)
0 голосов
/ 01 июня 2018

Простой apply по строке сделает это.Я подставляю data.frame, используя grep, чтобы получить столбцы, начинающиеся с "sp".

pine <- apply(sp[grep("^sp", names(sp))], 1, function(x) sum(x == "pine"))
pine
#[1] 0 1 1

Data.

sp <- 
structure(list(Join = 1:3, p1 = 0:2, sp1 = structure(c(1L, 2L, 
2L), .Label = c("0", "pine"), class = "factor"), p2 = c(0L, 0L, 
0L), sp2 = c(0L, 0L, 0L), p3 = c(0L, 1L, 0L), sp3 = structure(c(1L, 
2L, 1L), .Label = c("0", "Aspen"), class = "factor")), class = "data.frame", row.names = c(NA, 
-3L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...