组合分类变量以在R中创建新的分类变量

时间:2018-05-30 12:23:13

标签: r data-manipulation

更新

我想根据数据框中的现有分类变量创建一个新的分类变量。我想这样做的方法是将某些级别的值组合起来并创建一个不同的级别

这是一个有效的

fac1 <- c("A","B", "C", "E", "F", "10", "11", "12", "19")
x1       <- c(NA,2,NA,3,4,5,6,7,NA)
data1    <- data.frame(fac1,x1)  

    fac1 x1
1    A NA
2    B  2
3    C NA
4    E  3
5    F  4
6   10  5
7   11  6
8   12  7
9   19 NA

考虑到data1是工作数据框,fact1是一个分类变量。根据上面显示的级别以及x1中显示的值,我想创建一个新的分类变量,它结合fac1中的级别来创建新级别并取平均值 x中显示的各自值中的值。

预期结果:

     fac1  fac2 x1
1    A     A NA
2    B     B  2
3    C   C-E  3
4    E   C-E  3
5    F     F  4
6   10 10-12  6
7   11 10-12  6
8   12 10-12  6
9   19    19 NA

更新2

大多数答案都有效,由于某些原因,``x1'中的值被填充了 - 我已根据不同的类别计算但问题相同。我无法理解数据库中问题的根源,以及我怀疑这与mean函数有关。

这里是我在我的原始数据库中获得的内容,其中x1是根据此示例替换旧值的变量。

 ind   year  HH_index cou   ind_2 ind2     x1
   <fct> <chr>    <dbl> <chr> <chr> <fct> <dbl>
 1 A     1995        NA AT    A     A     0.188
 2 B     1995        NA AT    B     B     0.188
 3 10-12 1995        NA AT    10-12 10-12 0.188
 4 10    1995        NA AT    10-12 10-12 0.188
 5 11    1995        NA AT    10-12 10-12 0.188
 6 12    1995        NA AT    10-12 10-12 0.188
 7 13    1995        NA AT    13-15 13    0.188
 8 14    1995        NA AT    13-15 14    0.188
 9 D     1995        NA AT    D-E   D-E   0.188
10 15    1995        NA AT    13-15 15    0.188

3 个答案:

答案 0 :(得分:0)

如果我理解正确,你想要的东西会是这样的,假设你只想要结合C和E线:

library(data.table)
setDT(data1)
data1[fac1 %in% c("C", "E"), c("fac2", "x1") := .("C-E", mean(x1))]
data1[is.na(fac2), fac2 := fac1]

虽然在您的情况下,x1的{​​{1}}的平均值不是fac1 %in% c("C", "E"),但它是3。如果您要删除NA,只需将NA添加到平均值。

答案 1 :(得分:0)

您的流程中的关键是找到一种方法,以流程可以理解的方式指定您的分组理念。考虑到您希望将不同的值组合在一起,最简单的方法是创建一个分组的查找表,该表将由该过程使用。

请参阅以下示例:

create or replace TRIGGER ACTIVITY_LABEL_TRIGGER
AFTER UPDATE OF ACTIVITY_LABEL, NOTES
ON OPS_BUILD_ACTIVITY_LABEL
FOR EACH ROW
BEGIN
 if ( nvl(:OLD.ACTIVITY_LABEL,'xYz#@!') != nvl(:NEW.ACTIVITY_LABEL,'xYz#@!')) then
  INSERT INTO ACTIVITY_LABEL_AUDIT_LOG
    (TABLE_NAME,
     COLUMN_NAME,
     OLD_VALUE,
     NEW_VALUE,
     UPDATED_BY,
     UPDATED_DTM)
  VALUES  
    ('OPS_BUILD_ACTIVITY_LABEL',
     'ACTIVITY_LABEL',
     :OLD.ACTIVITY_LABEL,
     :NEW.ACTIVITY_LABEL,
     :NEW.LAST_UPDATED_BY,
     :NEW.LAST_UPDATED_DTM);
 end if;

 if (nvl(:OLD.NOTES,'xYz#@!') != nvl(:NEW.NOTES,'xYz#@!') ) then
  INSERT INTO ACTIVITY_LABEL_AUDIT_LOG
    (TABLE_NAME,
     COLUMN_NAME,
     OLD_VALUE,
     NEW_VALUE,
     UPDATED_BY,
     UPDATED_DTM)
  VALUES  
    ('OPS_BUILD_ACTIVITY_LABEL',
     'NOTES',
     :OLD.NOTES,
     :NEW.NOTES,
     :NEW.LAST_UPDATED_BY,
     :NEW.LAST_UPDATED_DTM);
 end if;
END; 

答案 2 :(得分:0)

您可以尝试使用plyr的{​​{1}}功能将因子标签与mapvalues一起重命名。其中tidyverse是要替换的项的向量,from是具有相同长度的替换值的向量。然后分组并计算新的to值。

x1