2016-04-22 4 views
1

Я ищу способ исключить ряд ответов из функции длины. Это является продолжением на вопрос из Getting R Frequency counts for all possible answers В SQL синтаксис может бытьИсключая ряд ответов из R dataframe

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

, чтобы получить ответ на 4, исключив 0 и NA?

+1

'длина (S.freq $ freq [S.freq $ freq! = 0 &! Is.na (S.freq $ S)])'? – Jaap

+0

Если бы вы могли добавить это как ответ @ procrastinatus-maximus, я помечаю его как выбранный ответ. Он выглядит более гибким, чем другие ответы, и позволяет легко добавлять в другие критерии. –

ответ

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]) 
2

Для вычисления суммы целых чисел вы можете использовать sum. если NA находятся в вашей колонке, вы можете использовать na.rm(), однако, поскольку NA находится в другом столбце, вам сначала нужно удалить строку, содержащую NA.

Наше решение заключается в следующем, мы удаляем строки, содержащие NA по Подменю S.freq[!is.na(S.freq$S),], но нам также нужно второй столбец freq:

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

Вы можете попробовать na.omit (для удаления NA с) и 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

Мы можем использовать colSums,

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

Вы ищете значения с помощью частоты y> 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)]) 
+0

Уникальный сбой, если количество частот дублируется для двух ответов. Пример длины (уникальный (df $ R [! Is.na (df $ R)])) [1] 3 > df $ R [1] 5 5 7 NA 9 –

+0

Каким будет ваш ожидаемый ответ для вектора df $ R? У вас есть следующие частоты 5: 2, 7: 1, NA: 1, 9: 1. Ommiting NA у вас есть 3 значения с частотой! = 0 – MarkusN

+0

длина будет 4 –

 Смежные вопросы

  • Нет связанных вопросов^_^