Циклы в R для разделения столбцов и переименования, а затем объединения в фрейм данных - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь разбить некоторые столбцы в фрейме данных на "." затем переименуйте разделенные столбцы на основе исходных имен. Исходный набор данных Ожидаемый результат

library(ISLR)
wage <- Wage #sample dataset from ISLR
wage_term_ref <- as.data.frame(wage[,3:9]) # These are the columns I need to split

colnames (wage_term_ref)

"maritl" "race" "education" "region" "jobclass" "health" "health_ins"

wage_term_ref[] <- lapply(wage_term_ref, as.character) # change all from factor to character

martil<- data.frame(do.call(rbind, strsplit(wage_term_ref$maritl, "[.]" ))) # split the first columne
names(martil)<-c("martil_Index","martil_Status") # rename the splited columns based on the original name "martil"

Затем мне нужно повторить то же самое для столбцов баланса 6 в wage_term_ref. Наконец, объедините все столбцы _Index (например, martil_Index) и wage [, 1: 2] в новый фрейм данных "wage_updated"

Может быть, у кого-нибудь есть способ сделать это лучше? Может быть ал oop? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Если вы хотите разделить несколько столбцов на одном разделителе, вы можете использовать cSplit из splitstackshape, что упрощает этот процесс.

splitstackshape::cSplit(wage_term_ref, names(wage_term_ref), '.')

Это добавляет _1, _2 к каждому столбцу имя автоматически.

0 голосов
/ 06 мая 2020

Раствор Base R:

#install.packages("ISLR", dependencies = TRUE)
library(ISLR)

# Import dataset from ISLR library, store copy: wage => data.frame
wage <- Wage #sample dataset from ISLR

# Boolean vector of vectors to split: split_col => vector of booleans
split_col <- sapply(wage, function(x){if(!(is.numeric(x))){any(grepl("[.]", x))}else{FALSE}})

# Create an empty list to store subsets from the wage data.frame: wage_list => list
wage_list <- vector("list", ncol(wage[,split_col]))

# Populate the list with vectors split on ".": wage_list => list
wage_list <- lapply(wage[,split_col], function(y){strsplit(as.character(y), "[.]")})

# Calculate the maximum number of vectors per list element in the wage_list: 
# max_lengths_per_el => list of named numeric vectors
max_lengths_per_el <- sapply(wage_list, function(z){max(lengths(z))})

# Convert each list element to a data.frame and name appropriately: 
# wage_list => list of data.frames
wage_list <- lapply(seq_along(wage_list), function(i){
  setNames(data.frame(do.call("rbind", wage_list[[i]]), row.names = NULL),
           paste(names(wage_list)[i], 1:max_lengths_per_el[i], sep = "_"))
  }
)

# Column bind the original data.set (excluding the columns that have been split)
# with a data.frame of the column-binded lists: wage_df => data.frame
wage_df <- cbind(wage[,!split_col], do.call("cbind", wage_list))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...