从R数据帧

时间:2016-04-22 06:24:39

标签: r subset na

我正在寻找一种从长度函数中排除多个答案的方法。 这是来自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的答案?

5 个答案:

答案 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)])