通过跟随R中单个变量中的数字乘以第一个数字

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (9)

根据一项调查,我有一个数据集,其中一列列出了某人饮用果汁的数量。收件人可以每天,每周或每月回复喝多少次汁液。

该列设置为3位整数,其中第一个数字是他们是选择每日/每周/每月,其余数字是他们在该时间段内喝果汁的次数。所以104意味着他们每天喝4次果汁。209意味着每周9次。等等

这是结构:

juice <- c(101,204,310)

我想创建一个标准化数据的新列,这样它就是“每周”的数字。因此,如果整数以1(每日)开头,则应将第二个2位(作为单个数字,例如04 = 4次)乘以7,并从开头移除“1”。如果以2(每周)开头,则删除第一个数字。如果它以3(每月)开头,除以30并乘以7并删除第一个数字。

我是R的新手并且不知道如何处理这个问题 - 任何帮助都将不胜感激!

提问于
用户回答回答于
> 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 base而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)))
用户回答回答于

用一些矢量化索引来做。我从@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

所属标签

可能回答问题的人

  • HKC

    红客学院 · 创始人 (已认证)

    27 粉丝7 提问5 回答
  • 西风

    renzha.net · 站长 (已认证)

    9 粉丝1 提问3 回答
  • 螃蟹居

    1 粉丝0 提问2 回答
  • 富有想象力的人

    2 粉丝0 提问1 回答

扫码关注云+社区

领取腾讯云代金券