2015-10-07 3 views
3

У меня есть dataframe, который выглядит примерно так, но в течение всего годастрочной процент с R

date  v1 v2 v3 v4 v5 v6 v7 v8 Fraction Percent 
01-02-2013 0 0 1 1 1 1 1 0 0.625 
01-03-2013 0 0 1 1 0 0 0 0 0.25 
01-04-2013 0 0 0 0 0 1 0 0 0.125 
01-05-2013 0 0 0 0 0 0 1 0 0.125 
01-06-2013 0 0 0 0 0 0 0 0 0 
.................................................... 
.................................................... 

Мой интерес вычислить процент колонки фракции. Я попытался использовать prop.table, но это не сработало. Я также попытался

df$Percent <- df$Fraction * 100 

он дал мне следующую ошибку

Error in df$Fraction[i] * 100 : non-numeric argument to binary operator 

Я пытался делать это в цикле, и вот код, который я использовал

df$Fraction <- 'NA' 
df$Percent <- 'NA' 
for (i in 1:nrow(df)) { 
    df$Fraction[i] <- round(sum(df[i, 2:9], na.rm=F)/8, 2) 
    # I have used only one of the following at one time 
    df$Percent[i] <- prop.table(as.array(df$Fraction[i]), margin= 2) *100 
    df$Percent[i] <- df$Fraction[i] * 100 
} 
+2

Проверьте класс фракции. Он был бы нечисловым. Вы преобразовали столбец из числового в нечисловой с помощью цитированного NA. Просто сделайте 'NA' вместо символа NA. – akrun

+2

'df $ Fraction <- as.numeric (df $ Fraction) * 100' – Mateusz1981

+0

класс' fraction' является 'character' –

ответ

3

Вместо использования for цикла, мы можем сделать это с rowSums

df$Fraction <- rowSums(df[2:9], na.rm=TRUE)/8 
df$Percent <- 100*df$Fraction 

Или как упомянуто @ColonelBeauvel, rowMeans будет более компактным и целесообразными.

df$Fraction <- rowMeans(df[2:9], na.rm=TRUE) 
+0

теперь это работает тоже. спасибо –

+0

@ShretaGhimire Извините, раньше не тестировал. – akrun

+0

Почему бы не прямо 'rowMeans'? –

0

Fraction переменная не является числовой. Попробуйте

df$Fraction <- as.numeric(df$Fraction) * 100

+1

Проблема была связана с опечаткой. –

+0

Проблема была вызвана «классом» столбца @Pascal –

+1

Право. И вы можете решить это, перейдя на 'df $ Fraction <- NA_real_' в первой строке вашего кода. –

1

Следующий код работает отлично для меня

df$Fraction <- NA 
df$Percent <- NA 
for (i in 1:nrow(df)) { 
    df$Fraction[i] <- round(sum(df[i, 2:9], na.rm=F)/8, 2) 
} 

df$Percent <- df$Fraction * 100 


# Alternative 
df$Frac <- round(rowSums(df[2:9], na.rm=T)/8, 2) 
df$Percent <- 100*df$Frac 

Я нашел два решения для вопроса я разместил.

1. я могу конец цитаты в NA, что я назначил, так что весь столбец становится logical и, следовательно, я могу вычислить процент (или умножить колонку с 100).

2. Я могу использовать as.numeric, если у меня есть котировки 'NA'.

Спасибо.