R:根据行名指定值

时间:2015-10-08 05:55:28

标签: r dataframe vectorization

> dput(dat)
structure(list(A = c(1L, 1L, 1L, 1L), B = c(1, 1, 1, 3), C = c(1L, 
1L, 1L, 1L), D = c(1L, 2L, 1L, 1L), E = c(1L, 1L, 1L, 1L), F = c(1L, 
1L, 1L, 1L), G = c(1L, 2L, 1L, 2L), H = c(1L, 2L, 1L, 1L)), .Names = c("A", 
"B", "C", "D", "E", "F", "G", "H"), row.names = c("month1", "month6", 
"month12", "month24"), class = "data.frame")
> dat
        A B C D E F G H
month1  1 1 1 1 1 1 1 1
month6  1 1 1 2 1 1 2 2
month12 1 1 1 1 1 1 1 1
month24 1 3 1 1 1 1 2 1

假设我的数据看起来像这样。我想根据值>的时间为这8列中的每一列分配一个值。首先发生1。如果值> 1发生在第1个月,我将为该列分配值1。在第6个月,我将为该列分配值1.5。在第12个月,我将分配2,在第24个月,我将分配3。

对于包含全1的列,我将NA分配给它们。我希望我的输出看起来像

 A   B   C   D   E   F   G   H
NA   3  NA 1.5  NA  NA 1.5 1.5

1 个答案:

答案 0 :(得分:0)

我们可以使用max.col。我们将data.frame转换为逻辑矩阵('m1'),转置它('m1'),使用max.col ties.method='first'获取每行的最大值列索引(如果有的话)每行多个TRUE),将行中的all个FALSE元素更改为NA(使用rowSumsNA^)。现在,我们可以将'i1'转换为'factor',指定levels' and标签',并将其更改为numeric

m1 <- t(dat >1)
i1 <- max.col(m1, 'first') * NA^(!rowSums(m1))
as.numeric(as.character(factor(i1, levels= 1:4, labels=c(1, 1.5, 2,3))))
#[1]  NA 3.0  NA 1.5  NA  NA 1.5 1.5

更新

如果某些数据集中缺少行/列,例如,我在这里创建一个缺少第二行的新数据集('dat1')(如果有多个数据集,我们可以将它放在{ {1}}并在循环(list)中执行此操作,而不是重复这些步骤。我们创建一个0矩阵('m2'),其维度和dimnames包含所有行/列,将'm2'中的0替换为数据集中存在的行/列值,然后像以前一样执行步骤

lapply(..