更新
我想根据数据框中的现有分类变量创建一个新的分类变量。我想这样做的方法是将某些级别的值组合起来并创建一个不同的级别
这是一个有效的
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
答案 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