Создать вектор в соответствии с несколькими условиями, содержащимися в векторах - PullRequest
1 голос
/ 20 февраля 2020

Представьте, что у меня есть data.frame:

a <- c("Boy","Girl","Dog","Cat","Chair","Table")
b <- c(1:6)
df <- data.frame(a,b)

Я хотел бы создать элементы группировки третьего столбца в первом столбце в соответствии с предопределенными векторами:

human <- c("Boy","Girl") 
pet <- c("Dog","Cat")
object <- c("Chair","Table")

С этим желаемый результат:

df$Type <- c("Human","Human","Animal","Animal","Object","Object")

Мне удалось сделать это правильно для 2 групп, но я не знаю, как включить третью:

df$Type1 <- ifelse(df$a==human,"Human","Animal")

Ответы [ 3 ]

2 голосов
/ 20 февраля 2020

Вы можете использовать вложенный ifelse () и использовать% в% вместо ==

ifelse(df$a %in% human, "Human", ifelse(df$a %in% pet, "Animal", "Object"))

Если предположить, что больше ничего не может быть, это будет работать

1 голос
/ 20 февраля 2020

Вы можете создать вектор, который свяжет указанные типы c с категориями, а затем заменить этот вектор своим фреймом данных. Например:

a <- c("Boy","Girl","Dog","Cat","Chair","Table")
b <- c(1:6)
df <- data.frame(a,b,stringsAsFactors = F) #Note, the stringsAsFactors = F

links <- c(
  "Boy" = "Human", 
  "Girl" = "Human",
  "Dog" = "Animal",
  "Cat" = "Animal",
  "Table" = "Object",
  "Chair" = "Object"
  )

df$Type <- links[df$a]

Вывод:

> df
      a b   Type
1   Boy 1  Human
2  Girl 2  Human
3   Dog 3 Animal
4   Cat 4 Animal
5 Chair 5 Object
6 Table 6 Object

Редактировать:

Если в людях, питомцах и объектах много значений, моё решение потребует набрав, например, ="human" несколько раз. Вот способ создать справочную таблицу, которую, вероятно, легче масштабировать

links_A <- c(
  "Boy" = "Human", 
  "Girl" = "Human",
  "Dog" = "Animal",
  "Cat" = "Animal",
  "Chair" = "Object",
  "Table" = "Object"
  )

human <- c("Boy","Girl") 
pet <- c("Dog","Cat")
object <- c("Chair","Table")

links_B <- rep(c("Human", "Animal", "Object"), times = lengths(list(human, pet, object)))
names(links_B) <- c(human, pet, object)

identical(links_A, links_B) # TRUE

1 голос
/ 20 февраля 2020

Вы можете добавлять группы следующим образом:

df$Type <- NA
df$Type <- ifelse(df$a %in% human, "Human", df$Type)
df$Type <- ifelse(df$a %in% pet, "Animal", df$Type)
df$Type <- ifelse(df$a %in% object, "Object", df$Type)

Результат:

      a b   Type
1   Boy 1  Human
2  Girl 2  Human
3   Dog 3 Animal
4   Cat 4 Animal
5 Chair 5 Object
6 Table 6 Object
...