2015-05-11 1 views
2

Доброго дня,Создание векторных символов столбца предопределенного текста и привязать его к существующему dataframe с помощью rbind или bind_rows

я представлю два [вероятные] очень хилых проблемы за отличный обзор.

Проблема № 1

У меня есть относительно аккуратный DF (DAT) с тусклыми 10299 х 563. 563 переменных, общие для обоих наборов данных, которые создали [] DAT являются 'субъект' (числовое), 'label' (числовое), 3: 563 (имена переменных из текстового файла). Наблюдения 1: 2947 взяты из «тестового» набора данных, тогда как наблюдения 2948: 10299 взяты из набора данных «обучения».

Я хотел бы, чтобы вставить столбец (заголовок = «типа») в Даты, что в основном строки 1: 2947 состоят из строки теста и строки 2948: 10299 строк поезд что способ, которым я могу группу позже по набору данных или другим аналогичным агрегатным функциям в dplyr/tidyr.

Я создал тест DF (testdf = 1: 10299: тусклый (testdf) = 102499 х 1), а затем:

testdat[1:2947 , "type"] <- c("test") 
testdat[2948:10299, "type"] <- c("train") 
> head(ds, 2);tail(ds, 2) 
    X1.10299 type 
1  1 test 
2  2 test 
     X1.10299 type 
10298 10298 train 
10299 10299 train 

Так что я действительно не нравится, что сейчас колонна X1 0,10299.

Вопросы:

  • есть лучший и более целесообразный способ создать столбец, который имеет то, что я ищу на основании моего случая использования выше?
  • Что такое хороший способ вставить этот столбец в 'dat', чтобы я мог использовать его позже для группировки с dplyr?

Проблема № 2

Как я прибыл в моем [почти] кругленьком ФРЕ (Даты) сверху было два взять DFS (тест и поезд) вид тусклый (2947 х 563 и 7352 x 563) соответственно, и rbinding их вместе.

Я подтверждаю, что все мои имена переменных присутствуют после связывания усилий что-то вроде этого:

test.names <- names(test) 
train.names <- names(train) 
identical(test.names, train.names) 
> TRUE 

Что интересно и главной задачей является то, что если я пытаюсь использовать bind_rows функцию от «dplyr» для выполнения того же связывающего упражнения:

dat <- bind_rows(test, train) 

Он возвращает dataframe, который, видимо, держит мой все мои наблюдения (х: 10299), но теперь моя переменная счетчика уменьшается от 563 до 470!

Вопрос:

  • Кто-нибудь знает, почему мои переменные быть нарезанной?
  • Это лучший способ совместить два в глубину той же структуры для последующего нарезания/перетасовки с dplyr/

tidyr?

Благодарим вас за внимание и внимание к этим вопросам.

Образец тест/поезд ДФСА для обзора (левое большинство числовых являются Д.Ф. индексами):

тест ф.р. тест [1:10, 1: 5]

subject labels tBodyAcc-mean()-X tBodyAcc-mean()-Y tBodyAcc-mean()-Z 
1  2  5   0.2571778  -0.02328523  -0.01465376 
2  2  5   0.2860267  -0.01316336  -0.11908252 
3  2  5   0.2754848  -0.02605042  -0.11815167 
4  2  5   0.2702982  -0.03261387  -0.11752018 
5  2  5   0.2748330  -0.02784779  -0.12952716 
6  2  5   0.2792199  -0.01862040  -0.11390197 
7  2  5   0.2797459  -0.01827103  -0.10399988 
8  2  5   0.2746005  -0.02503513  -0.11683085 
9  2  5   0.2725287  -0.02095401  -0.11447249 
10  2  5   0.2757457  -0.01037199  -0.09977589 

поезда df поезд [1:10, 1: 5]

subject label tBodyAcc-mean()-X tBodyAcc-mean()-Y tBodyAcc-mean()-Z 
1  1  5   0.2885845  -0.020294171  -0.1329051 
2  1  5   0.2784188  -0.016410568  -0.1235202 
3  1  5   0.2796531  -0.019467156  -0.1134617 
4  1  5   0.2791739  -0.026200646  -0.1232826 
5  1  5   0.2766288  -0.016569655  -0.1153619 
6  1  5   0.2771988  -0.010097850  -0.1051373 
7  1  5   0.2794539  -0.019640776  -0.1100221 
8  1  5   0.2774325  -0.030488303  -0.1253604 
9  1  5   0.2772934  -0.021750698  -0.1207508 
10  1  5   0.2805857  -0.009960298  -0.1060652 

Фактический код (игнорируйте вызовы функций/выполняю большую часть тестирования через консоль).

[http://archive.ics.uci.edu/ml/machine-learning-databases/00240/]The набор данных, который я использую с этим кодом. 1

run_analysis <- function() { 
    #Vars available for use throughout the function that should be preserved 
    vars <- read.table("features.txt", header = FALSE, sep = "") 
    lookup_table <- data.frame(activitynum = c(1,2,3,4,5,6), 
           activity_label = c("walking", "walking_up", 
                "walking_down", "sitting", 
                "standing", "laying")) 
    test <- test_read_process(vars, lookup_table) 
    train <- train_read_process(vars, lookup_table) 
} 

test_read_process <- function(vars, lookup_table) { 
    #read in the three documents for cbinding later 
    test.sub <- read.table("test/subject_test.txt", header = FALSE) 
    test.labels <- read.table("test/y_test.txt", header = FALSE) 
    test.obs <- read.table("test/X_test.txt", header = FALSE, sep = "") 

    #cbind the cols together and set remaining colNames to var names in vars 
    test.dat <- cbind(test.sub, test.labels, test.obs) 
    colnames(test.dat) <- c("subject", "labels", as.character(vars[,2])) 

    #Use lookup_table to set the "test_labels" string values that correspond 
    #to their integer IDs 
    #test.lookup <- merge(test, lookup_table, by.x = "labels", 
    #    by.y ="activitynum", all.x = T) 

    #Remove temporary symbols from globalEnv/memory 
    rm(test.sub, test.labels, test.obs) 

    #return 
    return(test.dat) 
} 

train_read_process <- function(vars, lookup_table) { 
    #read in the three documents for cbinding 
    train.sub <- read.table("train/subject_train.txt", header = FALSE) 
    train.labels <- read.table("train/y_train.txt", header = FALSE) 
    train.obs <- read.table("train/X_train.txt", header = FALSE, sep = "") 

    #cbind the cols together and set remaining colNames to var names in vars 
    train.dat <- cbind(train.sub, train.labels, train.obs)  
    colnames(train.dat) <- c("subject", "label", as.character(vars[,2])) 

    #Clean up temporary symbols from globalEnv/memory 
    rm(train.sub, train.labels, train.obs, vars) 

    return(train.dat) 
} 
+1

Привет Зак, это, безусловно, интересно, ничего о том, что вы делаете выскакивает для меня как нечто, что создавало бы то, что вы видите. Можете ли вы дублировать поведение с подмножеством данных, которые вы могли бы воспроизвести здесь (меньшее количество строк/столбцов, которые могут быть 'dput()' или считаны? –

+0

@ ForrestR.Stevens Обновлен вопрос с воспроизводимым [надеюсь,] набором данных. – Zach

ответ

1

Проблема, с которой вы столкнулись проистекает из того факта, что вы дублируетесь именами в списке переменного, которые вы используете, чтобы создавать объекты фрейма данных. Если вы убедитесь, что имена столбцов уникальны и разделены между объектами, которые будет запущен код. Я включил полностью рабочий пример, основанный на коде, который вы использовали выше (с исправлениями и различными исправлениями, отмеченных в комментариях):

vars <- read.table(file="features.txt", header=F, stringsAsFactors=F) 

## FRS: This is the source of original problem: 
duplicated(vars[,2]) 
vars[317:340,2] 
duplicated(vars[317:340,2]) 
vars[396:419,2] 

## FRS: I edited the following to both account for your data and variable 
## issues: 
test_read_process <- function() { 
    #read in the three documents for cbinding later 
    test.sub <- read.table("test/subject_test.txt", header = FALSE) 
    test.labels <- read.table("test/y_test.txt", header = FALSE) 
    test.obs <- read.table("test/X_test.txt", header = FALSE, sep = "") 

    #cbind the cols together and set remaining colNames to var names in vars 
    test.dat <- cbind(test.sub, test.labels, test.obs) 
    #colnames(test.dat) <- c("subject", "labels", as.character(vars[,2])) 
    colnames(test.dat) <- c("subject", "labels", paste0("V", 1:nrow(vars))) 

    return(test.dat) 
} 

train_read_process <- function() { 
    #read in the three documents for cbinding 
    train.sub <- read.table("train/subject_train.txt", header = FALSE) 
    train.labels <- read.table("train/y_train.txt", header = FALSE) 
    train.obs <- read.table("train/X_train.txt", header = FALSE, sep = "") 

    #cbind the cols together and set remaining colNames to var names in vars 
    train.dat <- cbind(train.sub, train.labels, train.obs)  
    #colnames(train.dat) <- c("subject", "labels", as.character(vars[,2])) 
    colnames(train.dat) <- c("subject", "labels", paste0("V", 1:nrow(vars))) 

    return(train.dat) 
} 


test_df <- test_read_process() 
train_df <- train_read_process() 

identical(names(test_df), names(train_df)) 


library("dplyr") 

## FRS: These could be piped together but I've kept them separate for clarity: 
train_df %>% 
    mutate(test="train") -> 
    train_df 

test_df %>% 
    mutate(test="test") -> 
    test_df 

test_df %>% 
    bind_rows(train_df) -> 
    out_df 

head(out_df) 
out_df 

## FRS: You can set your column names to those of the original 
## variable list but you still have duplicates to deal with: 
names(out_df) <- c("subject", "labels", as.character(vars[,2]), "test") 

duplicated(names(out_df)) 
+0

Вы считаете, что причина, по которой у меня есть дельта столбца между rbind и bind_rows, связана с тем, что bind_rows удаляет столбцы с не-буквенно-цифровыми выражениями? – Zach

+0

Я не знаю, не видя фактических выдержек из вашего кода и способа, которым все ваши данные считываются. Но из ваших проверок выше с 'identity()', который, похоже, не был таким. Как я уже сказал, я был озадачен этим результатом и не мог видеть очевидной причины, по которой вы были бы особенно если все типы данных совпадают и т. д. ('bind_rows()' будет barf, если типы данных столбцов будут смешанными). –

+0

Обновлено исходное сообщение, чтобы включить фактический код, который я написал до сих пор через консоль t esting. – Zach

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