我正在寻找一种从长度函数中排除多个答案的方法。 这是来自Getting R Frequency counts for all possible answers的后续问题。在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的答案?
答案 0 :(得分:3)
我们可以使用colSums
,
colSums(!is.na(S.freq)[S.freq$freq!=0,])[[1]]
#[1] 4
答案 1 :(得分:2)
您可以使用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
答案 2 :(得分:2)
您可以尝试na.omit
(删除NA
s)和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
它能解决你的问题吗?
答案 3 :(得分:1)
只需添加!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])
答案 4 :(得分:0)
您正在寻找频率为&gt;的值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)])