2017-02-10 20 views
0

У меня есть данные, в которых один столбец должен иметь модификацию, правильно обрабатывая символы NA, символы и цифры. Данные имеют похожие имена, и интересующий столбец является общим. Я сделал цикл for, чтобы правильно изменить каждую строку столбца интереса. Однако для этого мне пришлось создать промежуточный объект «df». Это необходимо? или исходные данные могут быть изменены напрямую.Цитирование с помощью аналогичных фреймов данных для применения изменений с использованием для

sheet1 <- read.table(text=" 
data 
    15448 
    something_else 
    15334 
    14477", header=TRUE, stringsAsFactors=FALSE) 
sheet2 <- read.table(text=" 
data 
    16448 
    NA 
    16477", header=TRUE, stringsAsFactors=FALSE) 

sheets<-ls()[grep("sheet",ls())] 

for(i in 1:length(sheets)) { 
    df<-NULL 
    df<-eval(parse(text = paste0("sheet",i))) 
    for (y in 1:length(df$data)){ 
    if(!is.na(as.integer(df$data[y]))) 
    { 
    df[["data"]][y]<-as.character(as.Date(as.integer(df$data[y]), origin = "1899-12-30")) 
    } 
    } 
    assign(eval(as.character(paste0("sheet",i))),df) 
} 
+0

У меня были проблемы с НС и персонажами. Я хочу сохранить все - также характер - информацию. может быть, вы можете показать мне. – Ferroao

+0

'sheets = mget (ls (pattern =" sheet [0-9] "))' –

ответ

1

As @ d.b. упоминает, рассматривают возможность взаимодействия с списком данных, особенно если они аналогично структурированы, так как вы можете запускать те же операции, используя процедуры применения, и экономить на управлении многими объектами в глобальной среде. Кроме того, рассмотрите использование векторизованного столбца ifelse для обновления.

И если вам действительно нужны отдельные объекты dataframe, используйте list2env для преобразования каждого элемента в отдельный объект. Ниже обертывания as.* функции с suppressWarnings, так как вы do хотите вернуть NA.

sheetList <- mget(ls(pattern = "sheet[0-9]")) 

sheetList <- lapply(sheetList, function(df) { 
    df$data <- ifelse(is.na(suppressWarnings(as.integer(df$data))), df$data, 
         as.character(suppressWarnings(as.Date(as.integer(df$data), 
                origin = "1899-12-30")))) 
    return(df) 
}) 

list2env(sheetList, envir=.GlobalEnv) 
+0

Для чего нужна строка символов? Столбцы в dataframes - это атомные векторы, то есть вы не можете смешивать разные типы. Либо это столбец даты, либо строковый столбец. – Parfait

+0

как персонаж будет показывать все, что я хочу. – Ferroao

+0

См. Обновление. Очень простое изменение 'NA' на' df $ data' для сохранения существующего значения данных. Любопытно, какой тип анализа вы надеетесь запустить с такими смешанными полями строк и дат? – Parfait