Создать новый столбец на основе 4 значений в другом столбце - PullRequest
22 голосов
/ 05 октября 2011

Я хочу создать новый столбец на основе 4 значений в другом столбце.

if col1=1 then col2= G;
if col1=2 then col2=H;
if col1=3 then col2=J;
if col1=4 then col2=K.

КАК ЭТО СДЕЛАТЬ В R? Пожалуйста, мне нужен кто-то, чтобы помочь решить эту проблему. Я пробовал if / else и ifelse, но, похоже, никто не работает. Спасибо

Ответы [ 4 ]

26 голосов
/ 05 октября 2011

Вы можете использовать вложенные ifelse:

col2 <- ifelse(col1==1, "G",
        ifelse(col1==2, "H",
        ifelse(col1==3, "J",
        ifelse(col1==4, "K",
                        NA  )))) # all other values map to NA

В этом простом случае это излишне, но для более сложных ...

19 голосов
/ 05 октября 2011

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

Сначала создайте пример данных:

set.seed(1)
dat <- data.frame(col1 = sample(1:4, 10, replace = TRUE))

Затем определите значения поиска и используйте подмножество [, чтобы найти желаемые результаты:

values <- c("G", "H", "J", "K")
dat$col2 <- values[dat$col1]

Результаты:

dat
   col1 col2
1     2    H
2     2    H
3     3    J
4     4    K
5     1    G
6     4    K
7     4    K
8     3    J
9     3    J
10    1    G

В целом, вы можете использовать [ подмножество в сочетании с match для решения этой проблемы:

index <- c(1, 2, 3, 4)
values <- c("G", "H", "J", "K")
dat$col2 <- values[match(dat$col1, index)]
dat
   col1 col2
1     2    H
2     2    H
3     3    J
4     4    K
5     1    G
6     4    K
7     4    K
8     3    J
9     3    J
10    1    G
6 голосов
/ 05 октября 2011

Есть несколько способов сделать это, но вот один.

set.seed(357)
mydf <- data.frame(col1 = sample(1:4, 10, replace = TRUE))
mydf$col2 <- rep(NA, nrow(mydf))
mydf[mydf$col1 == 1, ][, "col2"] <- "A"
mydf[mydf$col1 == 2, ][, "col2"] <- "B"
mydf[mydf$col1 == 3, ][, "col2"] <- "C"
mydf[mydf$col1 == 4, ][, "col2"] <- "D"

   col1 col2
1     1    A
2     1    A
3     2    B
4     1    A
5     3    C
6     2    B
7     4    D
8     3    C
9     4    D
10    4    D

Вот один, использующий car 'recode.

library(car)
mydf$col3 <- recode(mydf$col1, "1" = 'A', "2" = 'B', "3" = 'C', "4" = 'D')

Еще один из этот вопрос :

mydf$col4 <- c("A", "B", "C", "D")[mydf$col1]
1 голос
/ 05 октября 2011

Вы могли бы взглянуть на ?symnum.

В вашем случае что-то вроде:

col2<-symnum(col1, seq(0.5, 4.5, by=1), symbols=c("G", "H", "J", "K"))

должно приблизить вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...