Фреймы данных в R: вычисление среднего числа строк в фрейме данных с игнорированием записей со значениями '0' - PullRequest
0 голосов
/ 06 декабря 2018

Скажем, в среде R у меня есть фрейм данных с n строками:

a b c classes
1 2 0  a
0 0 2  b
0 1 0  c

Результат, который я ищу: 1Получить количество ненулевых значений в каждой строке

size_of_a = 2
average_of_a = 1.5

size_of_b= 1
average_of_b= 2
.
the same for the other rows

Я пытался rowSums(dt[-c(4)]!=0) найти ненулевые элементы, но я не могу быть уверен, что «столбец классов» будет4 колонка.

Буду признателен за помощь в получении этих результатов.Спасибо

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Сначала я создаю фрейм данных.

df <- read.table(text = "a b c classes
1 2 0  a
0 0 2  b
0 1 0  c", header = TRUE)

Затем я заменяю нули на NA s, чтобы упростить жизнь, поскольку функции часто имеют na.rm, чтобы игнорировать их.

df[df==0] <- NA

Наконец, я связываю сумму ненулевых элементов, средних значений и имен классов в фрейм данных.

data.frame(classes = df[,4], 
           size = rowSums(df[, -4]>0, na.rm = TRUE), 
           mean = rowMeans(df[, -4], na.rm = TRUE))

, что дает,

#   classes size mean
# 1       a    2  1.5
# 2       b    1  2.0
# 3       c    1  1.0

Редактировать

data.frame(classes = df[,"classes"], 
           size = rowSums(df[, names(df) != "classes"]>0, na.rm = TRUE), 
           mean = rowMeans(df[, names(df) != "classes"], na.rm = TRUE))

#   classes size mean
# 1       a    2  1.5
# 2       b    1  2.0
# 3       c    1  1.0
0 голосов
/ 06 декабря 2018

Другой синтаксис для создания фрейма данных с использованием функции tibble из библиотеки dplyr:

library(dplyr)
df <- 
  tibble(
  a = c(1,0,0), 
  b = c(2,0,1),
  c = c(0,2,0), 
  classes = c("a", "b", "c")
  )

Для подсчета элементов в строке, равных нулю, вы можете оценить всю строку, даже если столбецclasses не является числовым

rowSums( df == 0 )

И наоборот, число элементов, отличных от нуля во всей строке, можно вычислить с помощью rowSums( df != 0 ).Таким образом, в среднем вы ищете:

rowSums( df[ , 1:3] )/rowSums( df[ ,1:3] != 0 ) 

Ура!

0 голосов
/ 06 декабря 2018

Вы можете сделать это с помощью

# Generate some fake data
set.seed(1)
n = 10
k = 5
x = matrix(runif(n * k), n, k)
x[x < 0.5] = 0

# Get number of nonzero entries in each row
nonzeros = apply(x, 1, function(z) sum(z != 0))

# Take row sums and divide by number of non-zero entries
rowSums(x) / nonzeros

Или, используя предоставленный вами фрейм data.frame, он будет выглядеть так:

# The data
x = structure(list(a = c(1L, 0L, 0L), b = c(2L, 0L, 1L), c = c(0L,
    2L, 0L), classes = structure(1:3, .Label = c("a", "b", "c"), class = "factor")), .Names = c("a",
    "b", "c", "classes"), class = "data.frame", row.names = c(NA,
    -3L))

column = which(names(x) == "classes")
nonzeros = apply(x[-column], 1, function(z) sum(z != 0))
rowSums(x[-column]) / nonzeros
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...