Разделите столбец кадра данных на фрагмент другого столбца. - PullRequest
1 голос
/ 23 октября 2019

У меня есть фрейм данных с тремя столбцами: один для идентификации, один с главной переменной и один с некоторыми значениями, которые будут использоваться для вычислений второго. Я хотел бы разделить второе на третье, но этот третий столбец имеет значения только на одном срезе.

Может быть, пример будет более понятным:

df <- data.frame(x = c("A", "B", "C", "A", "B", "C"),
                 y = c(2, 4, NA, 6, 6, 7),
                 z = c(NA, NA, NA, 8, 5, 3))

Вот ожидаемый результат:

df_expected <- data.frame(x = c("A", "B", "C", "A", "B", "C"),
                          y = c(2/8, 4/5, NA, 6/8, 6/5, 7/3),
                          z = c(NA, NA, NA, 8, 5, 3))

Как видите, я бы хотел сгруппировать наблюдения по столбцу id x, а затем разделить столбец y на столбец z.

Это то, что я 'мы сделали до сих пор:

library(dplyr)

computation <- function(t){
  df$t <- ifelse(df$z == NA, NA, df$t/df$z)
}

df %>%
  group_by(x) %>%
  mutate_at(c("y"), .funs = computation)

но у меня есть ошибка:

Erreur : Column `y` must be length 2 (the group size) or one, not 6

Как я могу это сделать? Я почти уверен, что мой вопрос уже задан и что он довольно прост, но я не могу понять, как это сделать.

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Полагаю, ваш "кусочек" где-то определен. Тогда вы можете просто использовать обычное деление, три действительных значения z будут переработаны.

defSlice <- 4:6
DT.tr <- transform(DT, y=y / z[defSlice])

DT.tr
#   x        y  z
# 1 A 0.250000 NA
# 2 B 0.800000 NA
# 3 C       NA NA
# 4 A 0.750000  8
# 5 B 1.200000  5
# 6 C 2.333333  3
1 голос
/ 23 октября 2019
library(dplyr)
df %>% group_by(x) %>% mutate(yz=y/z[!is.na(z)])

Используйте first(z[!is.na(z)]), если у вас есть несколько срезов значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...