从 R 数据帧中排除一些答案

Excluding a number of answers from a R dataframe

我正在寻找一种从长度函数中排除多个答案的方法。 这是 的后续问题,在 sql 中,语法可能是

  select * from someTable
  where variableName not in ( 0, null )

给定

Id <- c(1,2,3,4,5)
ClassA <- c(1,NA,3,1,1)
ClassB <- c(2,1,1,3,3)
R <- c(5,5,7,NA,9)
S <- c(3,7,NA,9,5)
df <- data.frame(Id,ClassA,ClassB,R,S)

ZeroTenNAScale <- c(0:10,NA);

R.freq = setNames(nm=c('R','freq'),data.frame(table(factor(df$R,levels=ZeroTenNAScale,exclude=NULL))));
S.freq = setNames(nm=c('S','freq'),data.frame(table(factor(df$S,levels=ZeroTenNAScale,exclude=NULL))));

length(S.freq$freq[S.freq$freq!=0])

# 5

我要怎么改

length(S.freq$freq[S.freq$freq!=0])

排除 0 和 NA 得到答案 4?

您可以使用sum来计算整数之和。如果在您的列中找到 NA,您可以使用 na.rm(),但是因为 NA 位于不同的列中,您首先需要删除包含 NA 的行。

我们的解决方案如下,我们通过子集S.freq[!is.na(S.freq$S),]去掉包含NA的行,但是我们还需要第二列freq:

sum(S.freq[!is.na(S.freq$S), "freq"])
# 4

您可以尝试 na.omit(删除 NAs)和 subset(删除 freq 中等于 0 的所有行):

subset(na.omit(S.freq), freq != 0)

   S freq
4  3    1
6  5    1
8  7    1
10 9    1

从这里开始,就很简单了:

length(subset(na.omit(S.freq), freq != 0)$freq)
[1] 4

它能解决您的问题吗?

我们可以使用colSums,

colSums(!is.na(S.freq)[S.freq$freq!=0,])[[1]]
#[1] 4

只需添加 !is.na(S.freq$S) 作为第二个过滤器:

length(S.freq$freq[S.freq$freq!=0 & !is.na(S.freq$S)])

如果你想用其他条件扩展它,你可以先做一个索引向量以提高可读性:

idx <- S.freq$freq!=0 & !is.na(S.freq$S)
length(S.freq$freq[idx])

您正在寻找频率 > 0 的值,这意味着您正在寻找唯一值。您可以直接从向量 S:

中获取此信息
length(unique(df$S))

将 NA 放在一边,您可以通过以下方式得到答案 4:

length(unique(df$S[!is.na(df$S)]))

关于如何根据项目的价值排除一些项目的问题: 在 R 中,这很容易用逻辑向量完成,因为您已经在代码中使用过它:

length(S.freq$freq[S.freq$freq!=0])

您可以将不同的条件组合成一个逻辑向量并将其用于子集,例如

length(S.freq$freq[S.freq$freq!=0 & !is.na(S.freq$freq)])