R: В моем фрейме данных есть 2 столбца, в каждой строке которых есть строка чисел, есть ли способ разделить строку и добавить значения каждого столбца? - PullRequest
3 голосов
/ 21 июня 2020

В моем фрейме данных в R у меня есть два столбца (A и B). В каждой строке столбца A и B есть строка чисел, разделенных запятыми.

Ряд 1, столбец A - 1,2,3,4 Строка 1, столбец B - 5,6,7,8

Я хочу добавить значения и создать еще один столбец C, чтобы результат выглядел так:

строка 1, столбец C - 6,8,10,12

Поскольку у меня несколько строк, я попытался написать для l oop

У меня есть код:

library(stringr)
for i in 1:nrow(dataset)
row_i = dataset[i, ]
A1 = str_split(row_i$A, ",")
B1 = str_split(row_i$B, ",")
unlist(A1)
unlist(B1)
as.numeric(A1)
as.numeric(B2)
dataset$C  = A1+B2
end  

Я получаю следующие ошибки Ошибка в withCallingHandlers (expr, warning = function (w) invokeRestart ("muffleWarning")): объект (list) не может быть принудительно введен для ввода 'double'

Ответы [ 3 ]

3 голосов
/ 21 июня 2020

Вот несколько подходов.

Здесь используется функция list_reduction из SOfun .

df <- data.frame(A = c("1,2,3,4", "9,10,11,12,13"),
                 B = c("5,6,7,8", "14,15,16,17,18"))
                 
## Grab `list_reduction` from "SOfun"
source("https://raw.githubusercontent.com/mrdwab/SOfun/master/R/list_reduction.R")

## Split the list
df_list <- lapply(df, function(x) type.convert(strsplit(as.character(x), ",", fixed = TRUE)))
df["C"] <- list_reduction(df_list, "+", flatten = TRUE)
df
#               A              B                  C
# 1       1,2,3,4        5,6,7,8       6, 8, 10, 12
# 2 9,10,11,12,13 14,15,16,17,18 23, 25, 27, 29, 31

Здесь используется cSplit из "splitstackshape" :

library(splitstackshape)
library(data.table)
cSplit(as.data.table(df, keep.rownames=TRUE), c("A", "B"), ",", "long")[
  , C := A + B][, lapply(.SD, toString), "rn"]
#    rn                 A                  B                  C
# 1:  1        1, 2, 3, 4         5, 6, 7, 8       6, 8, 10, 12
# 2:  2 9, 10, 11, 12, 13 14, 15, 16, 17, 18 23, 25, 27, 29, 31
3 голосов
/ 21 июня 2020

Если ваш фрейм данных выглядит следующим образом:

dataset <- data.frame(A = '1,2,3,4', B = '5,6,7,8')

Вы можете использовать separate_rows, чтобы получить данные в отдельных строках и добавить два столбца.

library(dplyr)

dataset %>%
 tidyr::separate_rows(A, B, convert = TRUE) %>%
 mutate(C = A+B)

#  A B  C
#1 1 5  6
#2 2 6  8
#3 3 7 10
#4 4 8 12

Или используя базу R :

transform(data.frame(A = as.numeric(strsplit(dataset$A, ',')[[1]]), 
                     B = as.numeric(strsplit(dataset$B, ',')[[1]])), 
                     C = A + B)
2 голосов
/ 21 июня 2020

Раствор Base R:

paste0(rowSums(sapply(df, function(x){ 
    as.numeric(unlist(strsplit(as.character(x), ",")))
    }
  )
),
collapse = ",")
...