Как отделить целые числа от строки в ячейке фрейма данных, разделенных запятыми? - PullRequest
0 голосов
/ 14 апреля 2020

В настоящее время у меня есть файл с различными ответами на некоторые вопросы. Каждая ячейка будет иметь от 1 до 4 чисел, за которыми следует слово «закончено» внутри одной ячейки. Например, df [1,1] может быть равно "-5", "2", "1", "Finished". Мне нужно иметь возможность избавиться от слова «закончено» и просто получить целые числа, чтобы я мог сложить их вместе, чтобы получить одно число для этой ячейки. Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 14 апреля 2020

Другая опция, использующая функцию R base apply:

df <- data.frame(X = c('-5,-2,1,Finished','1,2,7,Finished','-3,-2,4,Finished'))

new_df <- apply(df, c(1, 2), FUN = function(x){
  values <- trimws(unlist(strsplit(x, split = ","))) # Convert cell values to a vector
  values <- values[which(!tolower(values) == "finished")] # Remove Finished
  return(sum(as.numeric(values), na.rm = T)) # Add remaining integer values
})

new_df
  X
[1,] -6
[2,] 10
[3,] -1

Выше будет проходить по каждой ячейке в кадре данных. Для каждой ячейки она преобразует значения ячейки в вектор, разделяя их запятыми. Затем он удалит «готовое» значение из вектора и, наконец, сложит все оставшиеся числовые значения c. new_df будет матрицей того же размера, что и df.

0 голосов
/ 14 апреля 2020

Может быть, вы можете попробовать код ниже

df <- within(df,
             Y <- sapply(regmatches(X,gregexpr("[+-]?\\d+",X)),
                            function(v) sum(as.integer(v))))

такой, что

> df
                 X  Y
1 -5,-2,1,Finished -6
2   1,2,7,Finished 10
3 -3,-2,4,Finished -1

Dummy Data

df <- data.frame(X = c('-5,-2,1,Finished','1,2,7,Finished','-3,-2,4,Finished'))
0 голосов
/ 14 апреля 2020

Один из вариантов после чтения файла с помощью read.csv/read.table заключается в использовании separate_rows для расширения строк после удаления «Завершено» при использовании convert = TRUE, а затем получения sum

library(dplyr)
library(tidyr)
library(stringr)
df1 %>%
     mutate(rn = row_number(), col2 = str_remove(col2, ",\\s*[Ff]inished")) %>%
     separate_rows(col2, sep= ",", convert = TRUE) %>%
     group_by(rn) %>%
     summarise(col3 = sum(col2, na.rm = TRUE)) %>%
     select(-rn) %>%
     bind_cols(df1, .)
# A tibble: 3 x 3
#   col1 col2              col3
#  <int> <chr>            <int>
#1     1 -5,-2,1,Finished    -6
#2     2 -3,-2,5,Finished     0
#3     3 3,4,2,Finished       9
* 1007. *

Или используя base R

df1$col3 <- sapply(sub(",[Ff]inished", "", df1$col2), function(str1)
            sum(scan(text = str1, what = numeric(), sep=",", quiet = TRUE)))

data

df1 <- read.csv('yourfile.csv', stringsAsFactors = FALSE)
df1 <- data.frame(col1 = 1:3, col2 = c('-5,-2,1,Finished', 
    '-3,-2,5,Finished', '3,4,2,Finished'), stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...