Умножьте первое число на следующие числа в одной переменной в R - PullRequest
0 голосов
/ 24 мая 2019

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

Столбец задается как трехзначное целое число, где первое число указывает, выбрали ли они ежедневно / еженедельно / ежемесячно, а оставшиеся цифры - сколько раз они пили сок в течение этого периода. Таким образом, 104 означает, что они пьют сок 4 раза в день. 209 будет означать 9 раз в неделю. и т.д.

Это структура:

juice <- c(101,204,310)

Я хочу создать новый столбец, который стандартизирует данные, так что это будет показатель «за неделю». Таким образом, если целое число начинается с 1 (ежедневно), оно должно умножить вторые 2 цифры (как одно число, например, 04 = 4 раза) на 7 и удалить «1» с начала. Если оно начинается с 2 (еженедельно), просто удалите первую цифру. Если оно начинается с 3 (ежемесячно), разделите на 30, умножьте на 7 и удалите первую цифру.

Я новичок в R и не знаю, как к этому подойти - любая помощь будет принята с благодарностью!

Ответы [ 3 ]

2 голосов
/ 24 мая 2019

Сделайте это с помощью некоторой векторизованной индексации.Я использовал данные примера из @divibisan:

df <- data.frame(juice = c(104, 106, 204, 209, 302, 332, 111))

c(7,1,7/30)[df$juice %/% 100]  * df$juice %% 100
#[1] 28.0000000 42.0000000  4.0000000  9.0000000  0.4666667  7.4666667 77.0000000
1 голос
/ 24 мая 2019
> dat_3digits <- data.frame(drinks = c(104,  209 , 301))
> 
> library(tidyverse)
> dat_3digits %>% 
    mutate(freq  = sub("\\d{2}$", "", drinks)%>%  as.numeric, 
           times = sub("\\d{1}", "", drinks) %>%  as.numeric,
           new_drinks = if_else(freq == 1, times * 7,
                                if_else(freq == 3, (times/30)*7, freq)))
  drinks freq times new_drinks
1    104    1     4 28.0000000
2    209    2     9  2.0000000
3    301    3     1  0.2333333

Использование базы R и substr вместо sub

transform(transform(dat_3digits, 
                    freq = as.numeric(substr(drinks, start=1, stop=1)),
                    drinks2 = as.numeric(substr(drinks, start=2, stop=3))),
          new_drinks = ifelse(freq == 1, drinks2 * 7,
                              if_else(freq == 3, (drinks2/30)*7, freq)))
0 голосов
/ 24 мая 2019

Мы можем сделать это в обратном направлении, разделив число напитков, используя separate, а затем case_when, чтобы умножить счет на соответствующее количество:

library(tidyverse)
df <- data.frame('juice' = c(104, 106, 204, 209, 302, 332, 111))

df %>%
    separate(juice, into = c('period', 'drinks'), sep = 1) %>% # split after 1st character
    mutate(
        drinks = as.numeric(drinks), # convert number of drinks to numeric
        dpw = case_when(             # then multiply based on the value of the first period
            period == 1 ~ drinks * 7,
            period == 2 ~ drinks,
            period == 3 ~ (drinks / 30) * 7 ))

  period drinks        dpw
1      1      4 28.0000000
2      1      6 42.0000000
3      2      4  4.0000000
4      2      9  9.0000000
5      3      2  0.4666667
6      3     32  7.4666667
7      1     11 77.0000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...