У меня есть фрейм данных с первым столбцом как features и другими столбцами со значениями в наборе {0,1,2, -1, -2}.

Вот структура данных.

df <- structure(list(Features = structure(c(1L, 11L, 12L, 13L, 14L, 
15L, 16L, 17L, 18L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), .Label = c("Var1", 
"Var10", "Var11", "Var12", "Var13", "Var14", "Var15", "Var16", 
"Var17", "Var18", "Var2", "Var3", "Var4", "Var5", "Var6", "Var7", 
"Var8", "Var9"), class = "factor"), Column1 = c(0L, 0L, 0L, 0L, 
0L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, -1L, -1L, -1L, 0L, 0L), Column2 = c(0L, 
0L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, -2L, -2L, -2L, -2L, -2L, 
0L, 0L), Column3 = c(0L, 0L, 0L, 0L, 2L, 2L, 2L, 2L, 2L, 2L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Column4 = c(0L, 0L, 0L, 2L, 
2L, 2L, 2L, 0L, 0L, 0L, 0L, 0L, -2L, -2L, -2L, -2L, 0L, 0L), 
    Column5 = c(0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 0L, 0L, 0L, 0L, 0L), Column6 = c(0L, 0L, 0L, 2L, 2L, 
    2L, 0L, 0L, -1L, -1L, -1L, -1L, -1L, -1L, 0L, 0L, 0L, 0L), 
    Column7 = c(-1L, -1L, 2L, 2L, 2L, 2L, 2L, 2L, -1L, -1L, -1L, 
    -1L, -1L, -1L, -1L, -1L, -1L, -1L), Column8 = c(1L, 1L, 1L, 
    1L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L
    )), class = "data.frame", row.names = c(NA, -18L))

Для каждого столбца я хотел рассчитать процент объектов без 0 в столбцах.

Любая помощь приветствуется. Большое спасибо.

2
beginner 3 Май 2019 в 18:26

3 ответа

Лучший ответ

Мы можем использовать colSums и делить на количество строк в кадре данных

colSums(df[-1] != 0)/nrow(df)

#Column1 Column2 Column3 Column4 Column5 Column6 Column7 Column8 
#  0.444   0.500   0.333   0.444   0.500   0.500   1.000   0.778 

Или используя dplyr

library(dplyr)
df %>%  summarise_at(-1, ~sum(.!= 0)/n())
1
Ronak Shah 3 Май 2019 в 15:39

Мы можем просто использовать colMeans в логическом matrix

colMeans(df[-1] != 0)
#    Column1   Column2   Column3   Column4   Column5   Column6   Column7   Column8 
# 0.4444444 0.5000000 0.3333333 0.4444444 0.5000000 0.5000000 1.0000000 0.7777778 

Или используя tidyverse

library(tidyverse)
map_dbl(df[-1], ~ mean(.x != 0))
2
akrun 3 Май 2019 в 15:39

Может быть, что-то вроде следующего будет делать то, что вы хотите.
df[-1] != 0 возвращает логическую матрицу, ее colSums - количество ненулевых записей в каждом столбце. Разделите на количество строк и умножьте на 100, чтобы получить желаемый процент.

100*colSums(df[-1] != 0)/nrow(df)
# Column1   Column2   Column3   Column4   Column5 
# 44.44444  50.00000  33.33333  44.44444  50.00000 
#  Column6   Column7   Column8 
# 50.00000 100.00000  77.77778
2
Rui Barradas 3 Май 2019 в 15:33