Выбор того, какие НС вы хотите учесть при умножении в R - PullRequest
0 голосов
/ 29 мая 2018

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

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

  Col1  Col2
1 0     <NA>
2 3    00:40:00
3 2    00:40:00
4 5    00:20:00
5 <NA>   NA
6 0     <NA>

Первое, что мне нужно сделать, - это преобразовать этот формат времени в минуты или секунды.Второе и трудная проблема здесь состоит в том, что для строк с по меньшей мере одним NA в каждой строке умножение должно происходить только в том случае, если NA присутствует только во втором столбце (посмотрите на строку 6 в этом примере).Результат умножения должен быть равен 0. С другой стороны, если в обоих столбцах есть NA, это означает, что эти наблюдения следует считать «отсутствующими» и возвращать NA.

Как мне поступить?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Мы можем преобразовать строки в объект времени и затем преобразовать его в секунды с помощью period_to_seconds (из lubridate).Получите индекс элементов, не являющихся NA, из 'Col2' ('i1'). На основе индекса создайте столбец 'Secs', умножив его на соответствующие элементы из 'Col1' и присвойте значения 0 в 'Col1' иявляется NA в Col2 до 0

library(lubridate)
secs <- period_to_seconds(hms(df1$Col2))
i1 <- !is.na(df1$Col2)
df1$Secs[i1] <- secs[i1] * df1$Col1[i1]
df1$Secs[df1$Col1==0 & !i1] <- 0
df1
#  Col1     Col2 Secs
#1    0     <NA>    0
#2    3 00:40:00 7200
#3    2 00:40:00 4800
#4    5 00:20:00 6000
#5   NA     <NA>   NA
#6    0     <NA>    0

data

df1 <- structure(list(Col1 = c(0L, 3L, 2L, 5L, NA, 0L), Col2 = c(NA, 
"00:40:00", "00:40:00", "00:20:00", NA, NA)), .Names = c("Col1", 
"Col2"), class = "data.frame", row.names = c("1", "2", "3", "4", 
"5", "6"))
0 голосов
/ 30 мая 2018

Вот подход, который по духу похож на решение @ akrun (в комментариях), но с использованием функции replace и без использования дополнительного индикатора i1.Сначала настройте данные и выполните преобразование в секунды для каждого @ akrun-указателя:

d <- data.frame(Col1 = c(0, 3, 2, 5, NA, 0),
                Col2 = c(NA, "00:40:00", "00:40:00", "00:20:00", NA, NA))
library(lubridate)
d$secs <- period_to_seconds(hms(d$Col2))

Теперь выполните умножение и замените NA s в строках, где Col1==0 на 0:

d$Col3 <- d$Col1 * d$secs
d$Col3 <- replace(d$Col3, d$Col1 == 0, 0)
# d$Col3[d$Col1 == 0] <- 0 # equivalent to above row

Результат:

d
#   Col1     Col2 secs Col3
# 1    0     <NA>   NA    0
# 2    3 00:40:00 2400 7200
# 3    2 00:40:00 2400 4800
# 4    5 00:20:00 1200 6000
# 5   NA     <NA>   NA   NA
# 6    0     <NA>   NA    0
...