Как суммировать числа, считающиеся строками? - PullRequest
2 голосов
/ 20 февраля 2020

В моем наборе данных есть такой столбец:

col1
1
1, 1, 1, 1
1, 1
1, 1, 1, 1, 1
1

Я пытаюсь суммировать каждую строку в новом столбце, как этот вывод:

col2
1
4
2
5
1

Я пытался сделать :

rowSums(as.numeric(as.character(df$col1)))
Error in rowSums(as.numeric(as.character(df$col1))) : 
  'x' must be an array of at least two dimensions
In addition: Warning message:
In is.data.frame(x) : NAs introduced by coercion

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

Данные:

structure(list(col1 = c("1", "1, 1, 1, 1", "1, 1", "1, 1, 1, 1, 1", "1"), 
row.names = c(NA, -5L), class = "data.frame")

Ответы [ 5 ]

4 голосов
/ 20 февраля 2020

Вы можете использовать sapply. strsplit позволяет получить только те цифры, которые вы хотите, затем преобразовать их из символа в цифру c и затем суммировать:

df$col2 <- sapply(strsplit(df$col1, ","), function(x) sum(as.numeric(x)))
df$col2

[1] 1 4 2 5 1

3 голосов
/ 20 февраля 2020

Одной из идей является использование eval(parse) после замены , на +, т. Е.

sapply(gsub(', ', '+', d3$col1, fixed = TRUE), function(i)eval(parse(text = i)))
#        1   1+1+1+1       1+1 1+1+1+1+1         1 
#        1         4         2         5         1 

Другая задача состоит в делении и суммировании

sapply(strsplit(d3$col1, ', '), function(i)sum(as.numeric(i)))
#[1] 1 4 2 5 1

Однако Если у вас есть только 1 для суммирования, вы можете просто посчитать их. Использование stringr,

stringr::str_count(d3$col1, '1')
[1] 1 4 2 5 1
2 голосов
/ 20 февраля 2020

Один dplyr и tidyr параметр может быть:

df %>%
 rowid_to_column() %>%
 separate_rows(col1, sep = ", ", convert = TRUE) %>%
 group_by(rowid) %>%
 summarise_all(sum)

  rowid  col1
  <int> <int>
1     1     1
2     2     4
3     3     2
4     4     5
5     5     1

или весьма удобным вариантом, включающим splitstackshape:

rowSums(cSplit(df, "col1"), na.rm = TRUE)
1 голос
/ 20 февраля 2020

Использование stringr:

library(stringr)

# assumes we are only summing integers, ignores decimals
sapply(str_extract_all(df$col1, "[0-9]+"), function(x) sum(as.integer(x)))
[1] 1 4 2 5 1


# Assumes we are only looking for the integer 1
str_count(df$col1, "1")
[1] 1 4 2 5 1
0 голосов
/ 20 февраля 2020

Мы можем читать с read.csv и использовать rowSums в base R

rowSums(read.csv(text = df1$col1, fill = TRUE, header = FALSE), na.rm = TRUE)
#[1] 1 4 2 5 1

данных

df1 <- structure(list(col1 = c("1", "1, 1, 1, 1", "1, 1", "1, 1, 1, 1, 1", 
 "1")), class = "data.frame", row.names = c(NA, -5L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...