Присвойте переменную указанной c ячейке во фрейме данных, когда позиция строки является динамической - PullRequest
2 голосов
/ 27 марта 2020

Цель здесь - автоматизировать конвейер обработки данных, где я могу читать в файле .csv, запускать скрипт и выводить обработанный файл, готовый для построения графиков данных. Все, что я делаю, это применяю некоторые операции к нескольким столбцам, но мне неясна автоматизация одного шага:

Мне нужно разделить значения в одном столбце на значения в другом, но перед делением мне нужно вычесть значение из указанной ячейки c. Однако в каждом отдельном файле .csv, который определяет c расположение ячейки, будет меняться, поэтому я не могу просто извлечь ячейку столбца / строки в качестве переменной и использовать ее. В качестве примера фрейма данных:

df<-

sampleid  t1    t2
a1        4     15
a2        3     18
a3        7     30
b1        6     17
blank     1     5

Функция будет тогда

df <- df %>% mutate(ri=(t1-1)/(t2-1))

Где «1», вычтенное из t1 и t2, происходит из значения «t1» пустой строки , Я хотел бы создать переменную значения этой ячейки, чтобы подставить в это уравнение (иногда это что-то отличное от 1). Указанная строка c во фрейме csv / data будет меняться в зависимости от общего количества выборок, поэтому я не могу каждый раз выбирать фиксированную ячейку.

В идеале это было бы просто

df <- df %>% mutate(ri=(t1-x)/(t2-x))

Где «x» было присвоено этому пустому значению t1 из фрейма данных.

Любые мысли о хорошем способе сделать это? Спасибо.

Ответы [ 2 ]

3 голосов
/ 27 марта 2020

Вы можете добавить переменную x в качестве столбца, а затем использовать формулу (а затем снова удалить x):

library(tidyverse)

df <- read.table(text = "sampleid  t1    t2
a1        4     15
a2        3     18
a3        7     30
b1        6     17
blank     1     5", header = TRUE, stringsAsFactors = FALSE)

df %>%
  mutate(x = df %>%
           filter(sampleid == "blank") %>%
           pull(t1)) %>%
  mutate(ri = (t1 - x) / (t2 - x)) %>%
  select(-x)

# sampleid t1 t2        ri
# 1       a1  4 1 0.2142857
# 2       a2  3 1 0.1176471
# 3       a3  7 1 0.2068966
# 4       b1  6 1 0.3125000
# 5    blank  1 1 0.0000000
1 голос
/ 27 марта 2020

Вы можете использовать match:

library(dplyr)
df %>% mutate(ri = {val = t1[match('blank', sampleid)];(t1- val)/(t2-val)})

#  sampleid t1 t2     ri
#1       a1  4 15 0.2143
#2       a2  3 18 0.1176
#3       a3  7 30 0.2069
#4       b1  6 17 0.3125
#5    blank  1  5 0.0000

Другие варианты могут быть с which.max, which или '==', если у вас есть только одно значение 'blank'

df %>% mutate(ri = {val = t1[which.max(sampleid == 'blank')];(t1- val)/(t2-val)})

df %>% mutate(ri = {val = t1[which(sampleid == 'blank')[1]];(t1- val)/(t2-val)})

df %>% mutate(ri = {val = t1[sampleid == 'blank'];(t1- val)/(t2-val)})

Вы можете использовать то же самое в базе R с transform

transform(df, ri = {val = t1[which.max(sampleid == 'blank')];(t1- val)/(t2-val)})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...