如何为R中的组创建包含特定值百分比的列[duplicate]

oxf4rvwz  于 2023-02-20  发布在  其他
关注(0)|答案(3)|浏览(92)
    • 此问题在此处已有答案**:

How to complete missing factor levels in data frame?(1个答案)
11小时前关门了。
我有这个数据集

dat = structure(list(mdm = 7:8, price = c(100L, 200L), count = c(200L, 300L)),
      class = "data.frame", row.names = c(NA, -2L))

我需要通过为每个mdm组添加一个包含百分比的列来转换此数据。

50, 60, 70, 80, 85, 90, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 110, 115, 120, 130, 140, 150

其中与值100相反,对于来自dat数据集的mdm的每个组,应当存在pricecount值。
预期输出:

perc    price   count
50  NA  NA
60  NA  NA
70  NA  NA
80  NA  NA
85  NA  NA
90  NA  NA
95  NA  NA
96  NA  NA
97  NA  NA
98  NA  NA
99  NA  NA
**100   100 200**
101 NA  NA
102 NA  NA
103 NA  NA
104 NA  NA
105 NA  NA
110 NA  NA
115 NA  NA
120 NA  NA
130 NA  NA
140 NA  NA
150 NA  NA
50  NA  NA
60  NA  NA
70  NA  NA
80  NA  NA
85  NA  NA
90  NA  NA
95  NA  NA
96  NA  NA
97  NA  NA
98  NA  NA
99  NA  NA
**100   200 300**
101 NA  NA
102 NA  NA
103 NA  NA
104 NA  NA
105 NA  NA
110 NA  NA
115 NA  NA
120 NA  NA
130 NA  NA
140 NA  NA
150 NA  NA

价格和计数的值分别等于100和200,因此我们将它们放在100的附近。
价格和数量的值分别等于200和300,因此我们将它们放在100附近。
做这件事最简单的方法是什么?谢谢你的帮助。

kognpnkq

kognpnkq1#

以下是tidyverse的方法:

library(dplyr)
library(tidyr)

vector <-  paste(c(50, 60, 70, 80, 85, 90, 95:105, 110, 115, 120, 130, 140, 150), collapse = ", ")

dat %>% 
  group_by(mdm) %>% 
  mutate(perc = vector) %>% 
  separate_rows(perc, sep=",", convert = TRUE) %>% 
  ungroup() %>% 
  select(perc, price, count) %>% 
  mutate(across(-perc, ~ifelse(perc==100, ., NA_real_))) %>% 
  print(n=50)
perc price count
   <int> <dbl> <dbl>
 1    50    NA    NA
 2    60    NA    NA
 3    70    NA    NA
 4    80    NA    NA
 5    85    NA    NA
 6    90    NA    NA
 7    95    NA    NA
 8    96    NA    NA
 9    97    NA    NA
10    98    NA    NA
11    99    NA    NA
12   100   100   200
13   101    NA    NA
14   102    NA    NA
15   103    NA    NA
16   104    NA    NA
17   105    NA    NA
18   110    NA    NA
19   115    NA    NA
20   120    NA    NA
21   130    NA    NA
22   140    NA    NA
23   150    NA    NA
24    50    NA    NA
25    60    NA    NA
26    70    NA    NA
27    80    NA    NA
28    85    NA    NA
29    90    NA    NA
30    95    NA    NA
31    96    NA    NA
32    97    NA    NA
33    98    NA    NA
34    99    NA    NA
35   100   200   300
36   101    NA    NA
37   102    NA    NA
38   103    NA    NA
39   104    NA    NA
40   105    NA    NA
41   110    NA    NA
42   115    NA    NA
43   120    NA    NA
44   130    NA    NA
45   140    NA    NA
46   150    NA    NA
lhcgjxsq

lhcgjxsq2#

您可以使用tidyr中的complete

tidyr::complete(
  cbind(dat, perc = 100),
  mdm, perc = c(50, 60, 70, 80, 85, 90, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 110, 115, 120, 130, 140, 150)
)

输出:

# A tibble: 46 × 4
     mdm  perc price count
   <int> <dbl> <int> <int>
 1     7    50    NA    NA
 2     7    60    NA    NA
 3     7    70    NA    NA
 4     7    80    NA    NA
 5     7    85    NA    NA
 6     7    90    NA    NA
 7     7    95    NA    NA
 8     7    96    NA    NA
 9     7    97    NA    NA
10     7    98    NA    NA
11     7    99    NA    NA
12     7   100   100   200
13     7   101    NA    NA
14     7   102    NA    NA
15     7   103    NA    NA
16     7   104    NA    NA
17     7   105    NA    NA
18     7   110    NA    NA
19     7   115    NA    NA
20     7   120    NA    NA
21     7   130    NA    NA
22     7   140    NA    NA
23     7   150    NA    NA
24     8    50    NA    NA
25     8    60    NA    NA
26     8    70    NA    NA
27     8    80    NA    NA
28     8    85    NA    NA
29     8    90    NA    NA
30     8    95    NA    NA
31     8    96    NA    NA
32     8    97    NA    NA
33     8    98    NA    NA
34     8    99    NA    NA
35     8   100   200   300
36     8   101    NA    NA
37     8   102    NA    NA
38     8   103    NA    NA
39     8   104    NA    NA
40     8   105    NA    NA
41     8   110    NA    NA
42     8   115    NA    NA
43     8   120    NA    NA
44     8   130    NA    NA
45     8   140    NA    NA
46     8   150    NA    NA
vybvopom

vybvopom3#

merge它与expand.grid

merge(cbind(dat, perc=100), 
      expand.grid(mdm=unique(dat$mdm), perc=c(50, 60, 70, 80, 85, 90, 95, 96, 97,
                                              98, 99, 100, 101, 102, 103, 104, 105, 
                                              110, 115, 120, 130, 140, 150)), 
      all=TRUE)
#    mdm perc price count
# 1    7   50    NA    NA
# 2    7   60    NA    NA
# 3    7   70    NA    NA
# 4    7   80    NA    NA
# 5    7   85    NA    NA
# 6    7   90    NA    NA
# 7    7   95    NA    NA
# 8    7   96    NA    NA
# 9    7   97    NA    NA
# 10   7   98    NA    NA
# 11   7   99    NA    NA
# 12   7  100   100   200
# 13   7  101    NA    NA
# 14   7  102    NA    NA
# 15   7  103    NA    NA
# 16   7  104    NA    NA
# 17   7  105    NA    NA
# 18   7  110    NA    NA
# 19   7  115    NA    NA
# 20   7  120    NA    NA
# 21   7  130    NA    NA
# 22   7  140    NA    NA
# 23   7  150    NA    NA
# 24   8   50    NA    NA
# 25   8   60    NA    NA
# 26   8   70    NA    NA
# 27   8   80    NA    NA
# 28   8   85    NA    NA
# 29   8   90    NA    NA
# 30   8   95    NA    NA
# 31   8   96    NA    NA
# 32   8   97    NA    NA
# 33   8   98    NA    NA
# 34   8   99    NA    NA
# 35   8  100   200   300
# 36   8  101    NA    NA
# 37   8  102    NA    NA
# 38   8  103    NA    NA
# 39   8  104    NA    NA
# 40   8  105    NA    NA
# 41   8  110    NA    NA
# 42   8  115    NA    NA
# 43   8  120    NA    NA
# 44   8  130    NA    NA
# 45   8  140    NA    NA
# 46   8  150    NA    NA

相关问题