用NA进行汇总和减去

问题描述

有人可以帮忙吗?

我有一个数据集

x <- data.frame(A = c(NA,'1','0','0'),B = c('0',NA),C = c('1',NA,NA))

我需要生成类似这样的东西(生成两个变量x5和x6):

 _ x1 x2 x3 x4  x5 x6
A  NA 1  0  0   1  2
B  0  0  0  NA  0  3
C  1  NA NA NA  1  0

谢谢

解决方法

也许您可以尝试下面的代码

setNames(
  cbind(
    data.frame(t(x)),t(sapply(x,function(v) table(factor(na.omit(v),levels = c(1,0)))))
  ),paste0("x",1:6)
)

给出

    x1   x2   x3   x4 x5 x6
A <NA>    1    0    0  1  2
B    0    0    0 <NA>  0  3
C    1 <NA> <NA> <NA>  1  0
,

我注意到您仍在对此进行评论。 @ThomasIsCoding的答案很好,但以防万一,这是您也可以考虑的另一种分步方法。

首先,转置您的数据框(我们称为df):

df <- as.data.frame(t(x))
df

    V1   V2   V3   V4
A <NA>    1    0    0
B    0    0    0 <NA>
C    1 <NA> <NA> <NA>

现在对于另外2列,使用rowSums来汇总“ 1”和“ 0”的值。给定数据中na.rm = TRUE的存在,您需要NA。值1:4代表前四列。

df$V5 <- rowSums(df[,1:4] == "1",na.rm = T)
df$V6 <- rowSums(df[,1:4] == "0",na.rm = T)
df

输出

    V1   V2   V3   V4 V5 V6
A <NA>    1    0    0  1  2
B    0    0    0 <NA>  0  3
C    1 <NA> <NA> <NA>  1  0