Создайте новую переменную, которая является изменением сгиба одной строки над другой строкой, и сделайте это для нескольких переменных - PullRequest
0 голосов
/ 09 января 2019

У меня есть образцы, которые были запущены и сгенерировали данные по 8 переменным. Каждый образец имеет серию «NIL» и 3 других «версии» того же образца (иногда 4 или 5). Что мне нужно, это создать 8 новых переменных, которые будут кратными изменениями каждой версии сэмпла против NIL этого сэмпла.

Чтобы запустить это для всех переменных, я знаю, что мне нужно использовать что-то вроде mutate_at (.funs = funs (FUNCTION HERE), .vars = var1: var8). Однако я не могу понять, какую функцию использовать.

x<-c(50,25,10,5)
y<-c(100,50,25,10)
z<-c(50,25,10,5)

sample<-c("a","a","a","a") 
sample_type<-c("a_bcg","a_esf","a_hiv","a_nil")
## sample_type column is the one which would serve as a reference for 
## me of how these "a"s are different from each other but for 
## calculation purposes we can just group by sample  
test<-as.tibble(cbind(x,y,z,sample))
test<-test%>%
  modify_at(c(1,2,3),as.numeric)

test%>%
  group_by(sample)%>% ## since there'd be more groups 
  mutate_at(.funs = funs(./slice(n)),.vars = (1:3))

Это не удалось Ошибка в mutate_impl (.data, точки): Ошибка оценки: нет применимого метода для slice_, примененного к объект класса "c ('double', 'numeric')".

Мне нужно создать функцию, которая принимает значение каждой строки столбца и делит его на определенную строку (в этой подгруппе) - и в этой строке есть «ноль», чтобы я мог сделать так, чтобы нулевой образец всегда может быть первым или последним в группе.

The expected would look like this 

x     y     z     sample   x_1   y_1   z_1
  <chr> <chr> <chr> <chr>  <dbl> <dbl> <dbl>
1 50    100   50    a         10  10      10
2 25    50    25    b          5   5       5
3 10    25    10    c          2   2.5     2
4 5     10    5     nil        1   1       1

1 Ответ

0 голосов
/ 09 января 2019

Я создал в ваших данных справочный столбец ref, в котором указывается строка "nil", с которой нужно делиться. Ваш ожидаемый результат будет тогда дано:

library(tidyverse)

x <- c(50,25,10,5)
y <- c(100,50,25,10)
z <- c(50,25,10,5)

sample <- c("a","a","a","a") 
sample_type <- c("a_bcg","a_esf","a_hiv","a_nil")
## sample_type column is the one which would serve as a reference for 
## me of how these "a"s are different from each other but for 
## calculation purposes we can just group by sample  

ref <- c(0, 0, 0, 1)
test <- as.tibble(cbind(x,y,z,sample, ref))
test <- test%>%
          modify_at(c(1,2,3),as.numeric)

test%>%
  group_by(sample)%>% ## since there'd be more groups 
  mutate_at(.funs = funs( `1` = . / .[ref == 1]), .vars = (1:3))

Я сохранил ваш код как можно ближе к тому, как вы его опубликовали.

...