Как использовать for-l oop для применения функции к указанным c значениям в столбце в кадре данных - PullRequest
2 голосов
/ 15 января 2020

У меня есть фрейм данных, в котором один столбец содержит время между двумя событиями, выраженное в годах. Я хотел бы, чтобы R создал новый столбец, содержащий значение наблюдений, содержащее значение <1 года, выраженное в днях. </p>

Я пытался использовать lapply для решения этой проблемы, но lapply дает матрицу в качестве значения, которое не является идеальным для меня. Я хотел бы использовать для l oop для этого, но мой опыт работы с циклами for ограничен.

dataframe <- data.frame(id=c(1,2,3,4,5), 
             names=c('a','b','c','d','e'),
             time_in_years=c(5.81, 0.39, 5.66, 4.18, 0.16),
             other_variable=c(3,4,23,0.7,76)
)

Как бы я go о построении для l oop, который добавляет столбец, содержащий значения "time_in_years" от 0 до 1 раз 365,25? Спасибо!

Ответы [ 3 ]

3 голосов
/ 15 января 2020

Вот базовое решение R с использованием ifelse()

dataframe <- within(dataframe, days <- 365.25*ifelse(time_in_years<1, time_in_years,NA))

, такое что

> dataframe
  id names time_in_years other_variable     days
1  1     a          5.81            3.0       NA
2  2     b          0.39            4.0 142.4475
3  3     c          5.66           23.0       NA
4  4     d          4.18            0.7       NA
5  5     e          0.16           76.0  58.4400
2 голосов
/ 15 января 2020

Что мне нравится в data.table, так это то, что вам не нужно ifelse в этой ситуации:

library(data.table)
datatable <- setDT(dataframe)
datatable[time_in_years<1,days := time_in_years*365.25]

   id names time_in_years other_variable     days
1:  1     a          5.81            3.0       NA
2:  2     b          0.39            4.0 142.4475
3:  3     c          5.66           23.0       NA
4:  4     d          4.18            0.7       NA
5:  5     e          0.16           76.0  58.4400

вы также можете сделать с filter и объединением в dplyr :

dataframe %>%
  filter(time_in_years < 1) %>%
  mutate(days = time_in_years * 365.25) %>%
  full_join(.,dataframe)

  id names time_in_years other_variable     days
1  2     b          0.39            4.0 142.4475
2  5     e          0.16           76.0  58.4400
3  1     a          5.81            3.0       NA
4  3     c          5.66           23.0       NA
5  4     d          4.18            0.7       NA
2 голосов
/ 15 января 2020

Использовать mutate из dplyr

Вы можете использовать что-то вроде этого:

library(dplyr)
dataframe <- dataframe %>%
   mutate(days = ifelse(between(time_in_years, 0, 1), time_in_years * 365.25, NA))

> dataframe

   id names time_in_years other_variable   days
1  1     a          5.81            3.0       NA
2  2     b          0.39            4.0 142.4475
3  3     c          5.66           23.0       NA
4  4     d          4.18            0.7       NA
5  5     e          0.16           76.0  58.4400

Без внешних библиотек

Если вы не хотите устанавливать какой-либо внешний пакет, Вы можете использовать что-то вроде этого:

dataframe$time_in_days <- ifelse(dataframe$time_in_years > 0 & dataframe$time_in_years < 1, 
                                 dataframe$time_in_years * 365.25, 
                                 NA)

Надеюсь, это поможет.

...