> 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
答案 0 :(得分:0)
我们可以使用max.col
。我们将data.frame转换为逻辑矩阵('m1'),转置它('m1'),使用max.col
ties.method='first'
获取每行的最大值列索引(如果有的话)每行多个TRUE),将行中的all
个FALSE元素更改为NA
(使用rowSums
和NA^
)。现在,我们可以将'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(..