Проблема при суммировании столбца в R - PullRequest
0 голосов
/ 27 января 2020

Для следующих данных:

Step    isWeekOfYearVisible setDecorationBackgroundVisible  setAlwaysFireDayProperty    setFont
1       0                   1                               0                           4
2       0                   1                               0                           4
3       0                   1                               0                           4
4       0                   1                               0                           4
5       0                   1                               0                           4
6       0                   1                               0                           4
7       0                   1                               0                           4
8       0                   1                               0                           4

Я хотел бы суммировать значения столбца, используя имя столбца. Для этого я написал следующий скрипт R:

  ddd <- read.csv("/home/adam/Desktop/data.csv")
  Method_name <- "isWeekOfYearVisible"
  col <- ddd[[Method_name]]
  print(sum(as.numeric(col)))

Результат равен 8, что неверно, поскольку сумма значений этого столбца должна быть равна 0.

Как можно Я это исправлю?

Ответы [ 2 ]

0 голосов
/ 27 января 2020

Именно то, что сказал @RonakShah, возможно, из-за того, что у вас есть строки как факторы.

Помимо его решения, вы можете просто установить options(stringsAsFactors = FALSE), чтобы data.frames не преобразовывал строки в факторы.

Другая возможность для вас - использовать tidyverse, и загрузите CSV с read_csv, и обработайте данные с tibble, который является современной реализацией data.frames. Эта реализация удаляет некоторые странные поведения, подобные этому, и некоторые другие.

Вот пример того, о чем я только что говорил:

# Your use case
df = data.frame(list( "a" = as.character(rep(0, 10)) ))
sum( as.numeric( df[["a"]] ) )
# [1] 10

# Converting your factors back to string, by getting the respective factor level
df = data.frame(list( "a" = as.character(rep(0, 10)) ))
sum( as.numeric( levels(df[["a"]]) ) )
# [1] 0

# The same thing just using tibble from tidyverse
library(tidyverse)
df = tibble(list( "a" = as.character(rep(0, 10)) ))
sum( as.numeric( df[["a"]] ) )
# [1] 0

# Setting the global setting for not to convert strings to factors
options(stringsAsFactors = F)
df = data.frame(list("a"=as.character(rep(0, 10)), "b"=as.character(rep(1, 10))))
sum( as.numeric( df[["a"]] ) )
# [1] 0
0 голосов
/ 27 января 2020

Это в основном потому, что столбец isWeekOfYearVisible представляет собой factor, смело преобразуйте его в цифру c, а затем sum. Используйте

sum(as.numeric(as.character(ddd[[Method_name]])))

Например, для этих данных

ddd <- structure(list(Step = 1:8, isWeekOfYearVisible = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "0", class = "factor"), 
setDecorationBackgroundVisible = c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L), setAlwaysFireDayProperty = c(0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L), setFont = c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L)), row.names = c(NA, 
-8L), class = "data.frame")

, когда вы делаете

sum(as.numeric(ddd[[Method_name]]))
#[1] 8

Затем, когда вы преобразуете его в символ, а затем цифры c Вы получаете

sum(as.numeric(as.character(ddd[[Method_name]])))
#[1] 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...