Использование ifelse для преобразования столбца в R - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть датафрейм с колонкой чисел.

В отдельном столбце я хочу напечатать, является ли число «меньше 10», «от 10 до 20» или «от 20 до 30» в зависимости от числа.

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

#create some data
data<-data.frame(number=(1:40))

#ifelse statement
data$words<-
ifelse(data[,"number"]>=0&&<=9,"less than 10",
ifelse(data[,"number"]>=10&&<=20,"between 10 and 20",
ifelse(data[,"number"]>=20&&<=30,"between 20 and 30", "other")))  

Ответы [ 4 ]

0 голосов
/ 21 ноября 2018

тебе нужно, чтобы все было в одном утверждении?

В вашем коде есть несколько синтаксических ошибок, но возможное решение было бы сделать что-то вроде этого

data$text <- "other"
data$text[data$number >=0 & data$number < 10] <- "less than 10"
data$text[data$number >=10 & data$number < 20] <- "between 10 and 20"
data$text[data$number >=20 & data$number < 30] <- "between 20 and 30"

Я создал новый столбец, потому что, если бы я должен был заменить значения вВ столбце «число» с текстом весь столбец будет приведен к типу символа, что может привести к непредвиденному поведению операторов неравенства.

У вас также есть некоторые совпадения в ваших категориях.Попробуйте изменить верхнюю границу на строго меньшее, чем (например, 20 равно> = 20 и <= 20, поэтому подпадает под категории «между 10 и 20» и «между 20 и 30» </p>

Если вы хотитев одну строку вы можете использовать функцию cut ():

cut(data$number, breaks=c(0,10,20,30,Inf), 
labels=c("less than 10", "between 10 and 20", "between 20 and 30", "other"))

, которая превращает числовой вектор в множитель.

0 голосов
/ 21 ноября 2018

Вы можете использовать cut из базы R, но имейте в виду, что переменная words является фактором.Вам просто нужно установить соответствующие интервалы (вот почему я использовал 30,5 и т. Д. Для удобства чтения).Кстати, в вашем примере вы должны закодировать 20 как «между 10 и 20» и «между 20 и 30», что не сработает.

data$words <- cut(data$number, c(0,9.5,20.5,30.5,40), c("less than 10", "between 10 and 20", "between 20 and 30", "other"))
data
0 голосов
/ 21 ноября 2018

Основная проблема заключалась в том, что вам нужно ссылаться на переменную в каждом тесте неравенства.Чтобы сделать это более читабельным, я завернул все в вызов with(data....Еще одной проблемой с вашим кодом было использование && вместо &.Первый предназначен только для одиночных значений, а второй сравнивает каждый элемент из двух векторов.

data$words<-
  with(data,
       ifelse(number >= 0 & number <= 9, "less than 10",
       ifelse(number >= 10 & number <= 20, "between 10 and 20",
       ifelse(number >= 20 & number <= 30, "between 20 and 30", "other"))))

Я также думаю, что это намного более читабельно, чем tidyverse без введения нового синтаксиса.Это также легче отлаживать.

0 голосов
/ 21 ноября 2018
library(tidyverse)
 data<-data.frame(number=(1:40))
 data %>% 
   mutate(word = case_when(
     number>=0 & number<10~"less than 10",
     number>=10 & number<20~"between 10 and 20",
     number>=20 & number<30~"between 20 and 30",
     T~"Other"
   ))
   number              word
1       1      less than 10
2       2      less than 10
3       3      less than 10
4       4      less than 10
5       5      less than 10
6       6      less than 10
7       7      less than 10
8       8      less than 10
9       9      less than 10
10     10 between 10 and 20
11     11 between 10 and 20
12     12 between 10 and 20
13     13 between 10 and 20
14     14 between 10 and 20
15     15 between 10 and 20
16     16 between 10 and 20
17     17 between 10 and 20
18     18 between 10 and 20
19     19 between 10 and 20
20     20 between 20 and 30
21     21 between 20 and 30
22     22 between 20 and 30
23     23 between 20 and 30
24     24 between 20 and 30
25     25 between 20 and 30
26     26 between 20 and 30
27     27 between 20 and 30
28     28 between 20 and 30
29     29 between 20 and 30
30     30             Other
31     31             Other
32     32             Other
33     33             Other
34     34             Other
35     35             Other
36     36             Other
37     37             Other
38     38             Other
39     39             Other
40     40             Other
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...