2016-08-07 2 views
3

Я хотел бы очистить имена столбцов нескольких фреймов данных, а не просто делать это за один раз в настоящее время. См. Код ниже.Чистые имена столбцов нескольких DataFrames

#Create data frame with basic data 
patientID <- c(1, 2, 3, 4) 
AdmDate <- as.POSIXct(c('2010-10-11','2008-3-25','2016-4-23','2011-6-12')) 
diabetes <- c("Type1", "Type2", "Type1", "Type2") 
`p-status` <- c("Poor", "Improved", "Excellent", "Poor") 
patientdata <- data.frame(`patient ID`, `Adm Date`, diabetes, `p-status`) 
patientdata 

#Find and replace spaces in column names 
names(patientdata) <- str_replace_all(names(patientdata)," *",'') 

#Find and replace hyphen in column name 
names(patientdata) <- str_replace_all(names(patientdata),"-",'') 

names(patientdata) 

мне нужно сделать эти же процедуры (замените пробелы/точки в именах столбцов и дефисов), по меньшей мере, двух различных кадров данных, но я не могу поставить вектор имен Col к str_replace_all. Обычный способ сделать это потребует по крайней мере 3 разных str_replace всех операторов для каждого кадра данных. Кроме того, файлы данных, с которыми я работаю, называются по-разному (например, order_table и sales_table). Мысли о том, как это сделать с меньшим количеством строк кода?

+0

Колонку имена не совпадают в примере –

ответ

3

Вот пример шаг за шагом процесс:

#Create data frame with basic data 
`patient ID` <- c(1, 2, 3, 4) 
`Adm Date` <- as.POSIXct(c('2010-10-11','2008-3-25','2016-4-23','2011-6-12')) 
diabetes <- c("Type1", "Type2", "Type1", "Type2") 
`p-status` <- c("Poor", "Improved", "Excellent", "Poor") 
patientdata <- data.frame(`patient ID`, `Adm Date`, diabetes, `p-status`, check.names=FALSE) 

#Create copies 
patientdata2 <- patientdata3 <- patientdata4 <- patientdata 

#Make list with all data frames 
lst <- mget(ls(pattern="^patientdata")) 

#Create Single Function to house all operations 

nameChange <- function(df) { 
    names(df) <- str_replace_all(names(df)," *",'') 
    names(df) <- str_replace_all(names(df),"-",'') 
    return(df) 
} 

#Iterate over all data frames 
library(stringr) 
lapply(lst, nameChange) 
# $patientdata 
# patientID AdmDate diabetes pstatus 
# 1   1 2010-10-11 Type1  Poor 
# 2   2 2008-03-25 Type2 Improved 
# 3   3 2016-04-23 Type1 Excellent 
# 4   4 2011-06-12 Type2  Poor 
# 
# $patientdata2 
# patientID AdmDate diabetes pstatus 
# 1   1 2010-10-11 Type1  Poor 
# 2   2 2008-03-25 Type2 Improved 
# 3   3 2016-04-23 Type1 Excellent 
# 4   4 2011-06-12 Type2  Poor 
# 
# $patientdata3 
# patientID AdmDate diabetes pstatus 
# 1   1 2010-10-11 Type1  Poor 
# 2   2 2008-03-25 Type2 Improved 
# 3   3 2016-04-23 Type1 Excellent 
# 4   4 2011-06-12 Type2  Poor 

Мы можем также избежать создания списка, если это является предпочтительным:

patientdata <- nameChange(patientdata) 
patientdata2 <- nameChange(patientdata2) 
patientdata3 <- nameChange(patientdata3) 
+0

Эта функция 'nameChange' возвращает новый data.frame, в отличие от решений, предусмотренных @akrun и меня, которые просто изменить имена атрибутов существующего data.frame , Это может сделать этот ответ дорогостоящим в больших списках больших data.frames. – C8H10N4O2

+0

@ C8H10N4O2 Ответы обоих ответов akrun возвращают кадры данных –

+1

Также этот ответ можно обобщить на концепции применения функций к нескольким кадрам данных с помощью одного вызова. 'data.table' быстрый код полезен, но не учит OP, как думать в терминах нескольких функциональных приложений фрейма данных. Оба ответа обеспечивают ценность. –

3

Использование setnames из data.table супер удобно.

Кроме того, ваши регулярные выражения, кажется, достаточно просто, что вы можете объединить их в один, таких как (*|-)

Пример:

df1 <- data.frame(a1=c(1,2,3),b2 = c(4,5,6), c3 = c(7,8,9)) 
df2 <- copy(df1) 
df3 <- copy(df1) 

library(data.table) 
for (df_name in c("df1","df2","df3")){ 
    setnames(get(df_name), gsub("a|b|c","whatever",colnames(get(df_name)))) 
} 
3

Мы можем использовать mgsub из qdap после размещения наборов данных в list

library(qdap) 
lst <- mget(ls(pattern="^patientdata")) 
lst1 <- lapply(lst, function(x) setNames(x, mgsub(c(" ", "-"), c("", ""), names(x)))) 

Или мы можем использовать только gsub

+0

Интересно, я узнал о новой функции от этого +1. Мой единственный комментарий в том, что OP не запрашивал список data.frames, просто для очистки data.frames. Поэтому я подумал, что их редактирование на месте имеет больше смысла. Если вы хотите использовать 'lapply', одним из вариантов было бы использовать' ls (pattern = ...) 'для возврата списка имен data.frame, а не самих data.frames. – C8H10N4O2

+0

@ C8H10N4O2 Я понимаю это, но может быть лучше разместить их в «списке», если OP захочет сделать больше изменений впоследствии. – akrun

Смежные вопросы