2015-12-30 3 views
0

У меня есть таблица, подобная следующей картинке, и я пытаюсь использовать простую инструкцию if, чтобы вернуть название страны только в тех случаях, когда пища «Апельсины». Третий столбец желаемого результата, 4-й столбец является то, что я получаю в R.r Если оператор возвращает число уровня, а не текст уровня

enter image description here

В Excel формула будет:

=IF(A2="Oranges",B2,"n/a") 

Я использовал следующий г код для генерации «oranges_country» переменный:

table$oranges_country <- ifelse (Food == "Oranges", Country , "n/a") 

[согласно изображению] код возвращает номер уровня (например, 6) в списке уровней для «Страны», а тх n 'Страна' (например, "Испания"). Я понимаю, откуда это происходит (позиция в выдержке, как показано ниже), но это боль, особенно при использовании нескольких вложенных операторов if.

levels(Country) 
[1] "California" "Ecuador"  "France"  "New Zealand" "Peru"  "Spain"  "UK" 

Должен быть простой способ изменить это ???

В соответствии с просьбой в комментарии: dput (таблица) вывод следующим образом: dput(table) structure(list(Food = structure(c(1L, 1L, 3L, 1L, 1L, 3L, 3L, 2L, 2L), .Label = c("Apples", "Bananas", "Oranges"), class = "factor"), Country = structure(c(3L, 7L, 6L, 4L, 7L, 6L, 1L, 5L, 2L), .Label = c("California", "Ecuador", "France", "New Zealand", "Peru", "Spain", "UK" ), class = "factor"), Desired_If.Outcome = structure(c(2L, 2L, 3L, 2L, 2L, 3L, 1L, 2L, 2L), .Label = c("California", "n/a", "Spain"), class = "factor"), oranges_country = c("n/a", "n/a", "6", "n/a", "n/a", "6", "1", "n/a", "n/a"), desiredcolumn = c(NA, NA, 6L, NA, NA, 6L, 1L, NA, NA)), .Names = c("Food", "Country", "Desired_If.Outcome", "oranges_country", "desiredcolumn"), row.names = c(NA, -9L), class = "data.frame")

ответ

0

Попробуйте петлю ifelse. Во-первых, изменить таблицу $ Страна по характеру()

table$Country<-as.character(Table$Country) 
table$desiredcolumn<-ifelse(table$Food == "Oranges", table$Country, NA) 

Вот моя версия:

Food<-c("Ap","Ap","Or","Ap","Ap","Or","Or","Ba","Ba") 
Country<-c("Fra","UK","Sp","Nz","UK","Sp","Cal","Per","Eq") 
Table<-cbind(Food,Country) 
Table<-data.frame(Table) 
Table$Country<-as.character(Table$Country) 
Table$DC<-ifelse(Table$Food=="Or", Table$Country, NA) 
Table 

Food Country DC 
1 Ap  Fra <NA> 
2 Ap  UK <NA> 
3 Or  Sp Sp 
4 Ap  Nz <NA> 
5 Ap  UK <NA> 
6 Or  Sp Sp 
7 Or  Cal Cal 
8 Ba  Per <NA> 
9 Ba  Eq <NA> 
+0

спасибо Макс. Это то, что я делал в своем извлечении кода выше 'table $ oranges_country <- ifelse (Food ==" Oranges ", Country," n/a ")'. Я просто попробовал ваш небольшой вариант, и он дает тот же результат '> wishcolumn [1] NA NA 6 NA NA 6 1 NA NA' – Rob

+0

Не могли бы вы разместить вывод таблицы с помощью dput (table). Если это много строк, то просто дает нам первые 10 строк. – MaxPD

+0

Не могли бы вы сначала сделать - 'table $ Country <-as.character (Таблица $ Страна)', а затем запустить код ifelse. – MaxPD

0

Попробуйте (если таблица называется table):

table[table$Food=="Oragnes", ] 
+0

Благодаря Марта, это действительно называется таблица! Это просто возвращает отфильтрованную таблицу только этих трех строк, относящихся к апельсинам? (не уверены, как включать таблицы в форматирование комментариев в стеке) – Rob

+0

Если вы хотите, чтобы выбранный столбец «Страна» был выбран, попробуйте: 'table [table $ Food ==« Oragnes »,] $ Страна' – Marta

+0

Ahh Я вижу. Но, допустим, в моем реальном примере у меня много столбцов, и я пытаюсь создать сложные вложенные операторы if, чтобы я мог сделать анализ «pivot» на этом, поэтому вместо этого мой r-код может быть чем-то вроде «table $ oranges_country < - ifelse (Food == «Апельсины», Country, ifelse (Food == «Яблоки», OtherVariable1, ifelse (Food == «Бананы», OtherVariable2, OtherVariable3))) 'поэтому я думаю, что это проще всего зафиксировать в одной колонке , – Rob

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