2015-01-12 2 views
0

Я пытаюсь извлечь данные из фрейма данных для анализа.R: Извлечение данных из данных из анализа

heightweight <- function(person, health) { 
    ## Read in data 
    data <- read.csv("heightweight.csv", header = TRUE, 
        colClasses = "character") 
    ## Check that the outcomes are valid 
    measure = c("height", "weight") 
    if(health %in% measure == FALSE){ 
     stop("Valid inputs are height and weight") 
    } 
    ## Truncate the data matrix to only what columns are needed 
    data <- data[c(1, 5, 7)] 
    ## Rename columns 
    names(data)[1] <- "Name" 
    names(data)[2] <- "Height" 
    names(data)[3] <- "Weight" 
    ## Convert numeric columns to numeric 
    data[, 2] <- as.numeric(data[, 3]) 
    data[, 3] <- as.numeric(data[, 4]) 
    ## Convert NAs to 0 after coercion 
    data[is.na(data)] <- 0 
    ## Check that the name is valid 
    name <- data[, 1] 
    name <- unique(name) 
    if(person %in% name == FALSE){ 
     stop("Invalid person") 
    } 
    ## Return person with lowest height or weight 
    list <- data[data$name == person & data[health],] 
    outcomes <- list[, health] 
    minumum <- which.min(outcomes) 
    ## Min Rate 
    minimum[rowNum, ]$name 
} 

Проблема, которую я имею, что происходит с

list <- data[data$name == person & data[health],] 

То есть, я бег heightweight("Bob", "weight"), я получаю следующее сообщение

Error in matrix(unlist(value, recursive = FALSE, use.names = FALSE), nrow = nr, : 
    length of 'dimnames' [2] not equal to array extent 

Я гугл этого сообщения и проверил некоторые здесь, но не может определить, в чем проблема.

+0

ли вы имеете в виду 'список <- данные [данные $ имя == человек и данные [здоровье] == здоровье]'? –

+0

@MaratTalipov делает это: 'Ошибка в [.data.frame (данные, данные $ name == person & data [health] ==: dims [product 4706] не соответствуют длине объекта [0]' – dustin

+0

каков ожидаемый результат из 'list <- data [data $ name == person & data [health],]'? –

ответ

3

Если я что-то не хватает, если вам нужен только самый низкий вес и высоту для данного имени, последние три строки кода немного избыточен.

Вот простой способ получить минимальное измерение здоровья для данного человека:

min(data[data$name==person, "height"]) 

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

Пример для иллюстрации результата:

data<-data.frame(name=as.character(c(rep("carlos",2),rep("marta",3),rep("johny",2),"sara"))) 
set.seed(1) 
data$height <- rnorm(8,68,3) 
data$weight <- rnorm(8,160,10) 

Соответствующий кадр данных:

name height weight 
1 carlos 66.12064 165.7578 
2 carlos 68.55093 156.9461 
3 marta 65.49311 175.1178 
4 marta 72.78584 163.8984 
5 marta 68.98852 153.7876 
6 johny 65.53859 137.8530 
7 johny 69.46229 171.2493 
8 sara 70.21497 159.5507 

Допустим, мы хотим, чтобы минимальный вес для Marta:

person <- "marta" 
health <- "weight" 

Минимальный " вес "для" marta "есть,

min(data[data$name==person,health]) 

, которая дает желаемый результат:

[1] 153.7876 
+0

Это не работает. – dustin

+0

Можете ли вы немного расширить? Вам нужно четко определить, что вы ищете. Вы хотите минимальную меру или весь список измерений? Из изложенного выше не совсем ясно. – AleMorales

+0

Ваш кадр данных похож на мой, но ваш код не работает в моей программе, 'min (data [data $ name == person, health])'. Он возвращает: 'In min (data [data $ name == person, health]): отсутствие непустых аргументов до min; возвращая Inf'. Кроме того, я представил нули, чтобы избавиться от НС, поэтому, если бы он работал, он возвращал бы нуль, так как каждый имеет по крайней мере один ноль. – dustin

0

Вот упрощенный аналог вашей функции:

heightweight <- function(person,health) { 
    data.set <- data.frame(names=rep(letters[1:5],each=3),height=171:185,weight=seq(95,81,by=-1)) 
    d1 <- data.set[data.set$name == person,] 
    d2 <- d1[d1[,health]==min(d1[,health]),] 
    d2[,c('names',health)]  
} 

Первая линия производит набор выборки данных. Вторая строка выбирает все записи для заданного person. Последняя строка находит запись, соответствующую минимальному значению health.

heightweight('b','height') 
# names height 
# 4  b 174 
+0

Это вернуло матрицу с 1985-м строками со всеми NA, некоторые из них были , а другие были NA. Я пробежал головой по данным, поэтому я знаю, что данные хороши, и нет NAs, поэтому я понятия не имею, что это за линия кода – dustin

+0

хм, это странно ... вы можете показать образец своих данных? –

+0

Он просто имел бы имена, hieght, вес как заголовки, а затем имена и цифры с 0 для NAs – dustin

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