R Разбор набора данных, чтобы избавиться от строк по определенному значению, а также включить создание столбцов на основе символа

У меня возникают проблемы с попыткой удалить строки из набора данных, который, кажется, имеет только один столбец, поэтому он похож на вектор-столбец. Я пытаюсь сделать две вещи, неважно, какая первая (для меня). Вот пример данных:

республиканец,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y
демократ,y,y,y,n,n ,n,y,y,y,n,n,n,n,n,?,?

Ввожу данные так:

sampledata <- read.table("house-votes-84.data",)

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

names(sampledata) <- c("col1" ...., "col17")

но может сделать это только в том случае, если есть 17 столбцов. Каждый из столбцов будет разделен запятой.

Во-вторых, я пытаюсь избавиться от строк со знаком вопроса?

Что я пробовал?

Я пробовал такие вещи, как (с моими данными, называемыми образцами данных):

sampledata[apply(sampledata[, -1], MARGIN = 1, function(x) all(x != "?")), ]  

Это не работает (и я предполагаю, что есть только один столбец, поэтому маржа должна быть чем-то, что просматривается в каждом из столбцов (я пробовал -1 для маржи, но безрезультатно)

Я попытался изменить ? на NA и использовать

na.omit(sampledata)

Это тоже не работает.

Я пробовал анализировать запятыми, такими как

splitting <- strsplit(as.character(sampledata$V1), split=",")

где V1 — имя одного столбца. Это самый интересный результат, который я получаю

435 из следующих (имеется 435 строк данных)

_[[435]]_  
_ [1] "republican" "n"          "y"          "n"          "y"        _  
_ [6] "y"          "y"          "n"          "n"          "n"       _
_[11] "y"          "n"          "y"          "y"          "y"  _
_[16] "NA"         "n"_

Но когда я пытаюсь изменить имя: Ошибка в

names(sampledata) <- c("col1", "col2", "col3", "col4", "col5",  : 'names' attribute [17] must be the same length as the vector [1]

Я пробовал другие вещи, такие как попытка превратить его в набор данных - однако это, похоже, превращает все значения в числа, которые выглядят рандомизированными (не что-то вроде 0, 1 или 99 для ?, а значения даже до 100, а может и больше)

Я просто пытаюсь получить данные в правильном формате, чтобы я мог запустить регрессию для образцов, у которых нет вопросительных знаков.

Сайты, с которыми мне больше всего повезло, это Stack Exchange Также и здесь:

подмножество строк со всеми/любыми столбцами больше, чем конкретное значение

И тут:

Преобразовать запись, разделенную запятыми, в столбцы

С первым я могу заставить его работать, но даже с этим я генерирую данные в 3 столбцах в самом коде - я не могу заставить тот же код работать с моим? (хотя я могу получить программа для удаления строк с вопросительными знаками, используя:

 X <- data.frame(Variable1=c(11,"?",12,15),Variable2=c(2,3,1,4))  
X[X$Variable1!="?", ]  

Я пытался найти способ сделать код, строка за строкой делать то же самое для импортированных данных, поскольку я также вытягиваю их как data.frame (я понимаю, что у меня есть только 1 столбец, а столбец называется V1, поэтому я также изменил код на

X$V1  

sampledata <- read.table("house-votes-84NaN.data.txt")
splitdat = do.call("rbind", strsplit(sampledata$V1, ","))

Но я получаю

**Error in strsplit(sampledata$V1, ",") : non-character argument**

Я понимаю, что мне нужно больше аргументов (я думаю) в read.table, поскольку у них есть еще несколько, но я не понимаю, что нужно делать.

Любая помощь будет очень высоко ценится.

Спасибо,

Брайан


person Relative0    schedule 21.12.2012    source источник
comment
Что бы я ни пытался, я не мог получить эту вещь, чтобы позволить мне опубликовать более подробную информацию, сказал что-то о раскомментированном коде   -  person Relative0    schedule 21.12.2012


Ответы (2)


( думаю, вам, вероятно, нужно быть более точным в отношении порядка операций транспонирования и удаления hte. Это сначала выполняет удаление, но даст вам другой результат, если вы сначала транспонируете.

 dat <- read.table(text="republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y
 democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,?,?", sep=",")
 dat
#--------------------
          V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17
1 republican  n  y  n  y  y  y  n  n   n   n   n   y   y   y   n   y
2   democrat  y  y  y  n  n  n  y  y   y   n   n   n   n   n   ?   ?
#--------------
 dat[ ! apply(dat, 1, function (x) any(x=="?") ), ]
#----------------
          V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17
1 republican  n  y  n  y  y  y  n  n   n   n   n   y   y   y   n   y

Я не уверен, зачем вам это транспонировать, но вы можете сделать это с помощью функции t (транспонировать).

> t( dat[ ! apply(dat, 1, function (x) any(x=="?") ), ] )
    1           
V1  "republican"
V2  "n"         
V3  "y"         
V4  "n"         
V5  "y"         
V6  "y"         
V7  "y"         
V8  "n"         
V9  "n"         
V10 "n"         
V11 "n"         
V12 "n"         
V13 "y"         
V14 "y"         
V15 "y"         
V16 "n"         
V17 "y"         

С данными в порядке партий вы можете исключить вопросы с любым "?" ответ в столбце с помощью применения с извлечением столбца (поместите применить fn в позицию столбца и используйте 2 в качестве аргумента MARGIN):

> dat[ , ! apply(dat, 2, function (x) any(x=="?") ) ]
          V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15
1 republican  n  y  n  y  y  y  n  n   n   n   n   y   y   y
2   democrat  y  y  y  n  n  n  y  y   y   n   n   n   n   n
person IRTFM    schedule 21.12.2012
comment
Я попытался импортировать свои данные: sampledata ‹- read.table(house-votes-84NaN.data.txt) и поместить sampledata в sampledata[apply(sampledata[, -1], MARGIN = 1, function(x) all(x ! = ?)), ] но я не могу заставить его работать! - person Relative0; 21.12.2012
comment
В данных вашего примера есть запятые, и это не разделитель по умолчанию. Поэтому добавьте sep="," в функцию чтения. Вторая часть вашего кода работает, чтобы удалить строку демократа, если данные находятся в порядке строк. - person IRTFM; 21.12.2012

Сначала прочитайте ваши данные с помощью функции read.csv и аргументов header = FALSE и row.names = 1:

sampledata <- read.csv(text="republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y
democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,?,?", header = FALSE, row.names = 1)

Затем вы можете транспонировать фрейм данных с помощью t:

t(sampledata)

Результат:

    republican democrat
V2  "n"        "y"     
V3  "y"        "y"     
V4  "n"        "y"     
V5  "y"        "n"     
V6  "y"        "n"     
V7  "y"        "n"     
V8  "n"        "y"     
V9  "n"        "y"     
V10 "n"        "y"     
V11 "n"        "n"     
V12 "n"        "n"     
V13 "y"        "n"     
V14 "y"        "n"     
V15 "y"        "n"     
V16 "n"        "?"     
V17 "y"        "?"

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

dat <- as.data.frame(t(sampledata))

dat[!apply(dat == "?", 2, any)]

    republican
V2           n
V3           y
V4           n
V5           y
V6           y
V7           y
V8           n
V9           n
V10          n
V11          n
V12          n
V13          y
V14          y
V15          y
V16          n
V17          y
person Sven Hohenstein    schedule 21.12.2012
comment
Я хочу сделать это для всех строк в файле — два выше были просто примерами. Мне нужно сделать это автоматически. - person Relative0; 21.12.2012
comment
Мне нужно сделать это для всех строк в текстовом файле. - person Relative0; 21.12.2012
comment
Кажется, я нашел часть ответа!: d = read.table(house-votes-84.data, sep=,, ) - person Relative0; 21.12.2012