从 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
(删除 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
它能解决您的问题吗?
我们可以使用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)])
我正在寻找一种从长度函数中排除多个答案的方法。
这是
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
(删除 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
它能解决您的问题吗?
我们可以使用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)])