Как использовать lapply () или ifelse () для нескольких столбцов, чтобы получить Yes == 1, а else == 0? - PullRequest
0 голосов
/ 26 марта 2020
A       B      C
Yes    Yes     No
No     Yes     Yes 
NA     No      No
Yes   Yes      No

мой желаемый вывод

A       B      C
1      1       0
0      1       1 
0      0       0
1      1       0

Я сейчас делаю

data$A <- ifelse(data$A  == "Yes", 1, 0)

Но как я могу сделать это для всех моих столбцов? Или что, если я хочу сделать это для столбцов B & C

Я попробовал это

data[2:3] <- data.frame(lapply(data[2:3], function(x) {ifelse(colnames(.)   == "Yes", 1, 0)} as.numeric(as.character(x))))

, но это не сработало.

Есть совет? Я устал от споров данных уже LOL.

Ответы [ 4 ]

2 голосов
/ 26 марта 2020

Вы можете попробовать использовать ifelse для всего фрейма данных:

ifelse(data == "No" | is.na(data), 0, 1)

     A B C
[1,] 1 1 0
[2,] 0 1 1
[3,] 0 0 0
[4,] 1 1 0

Данные:

data <- data.frame(A=c("Yes", "No", NA, "Yes"),
                   B=c("Yes", "Yes", "No", "Yes"),
                   C=c("No", "Yes", "No", "No"), stringsAsFactors=FALSE)

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

1 голос
/ 26 марта 2020

Другим вариантом является приведение логического к двоичному

 +(data != 'No' & !is.na(data))
#    A B C
#[1,] 1 1 0
#[2,] 0 1 1
#[3,] 0 0 0
#[4,] 1 1 0

data

data <- data.frame(A=c("Yes", "No", NA, "Yes"),
                   B=c("Yes", "Yes", "No", "Yes"),
                   C=c("No", "Yes", "No", "No"), stringsAsFactors=FALSE)
0 голосов
/ 26 марта 2020

Любая из этих работ - сделайте свой выбор:

sapply(data, function(x) ifelse(x == "No" | is.na(x), 0, 1))
     A B C
[1,] 1 1 0
[2,] 0 1 1
[3,] 0 0 0
[4,] 1 1 0

apply(data, 2, function(x) ifelse(x == "No" | is.na(x), 0, 1))
     A B C
[1,] 1 1 0
[2,] 0 1 1
[3,] 0 0 0
[4,] 1 1 0
0 голосов
/ 26 марта 2020

Вы можете использовать эту единственную строку искаженного кода:

df<-as.data.frame(lapply(c("A","B","C"), function(X) ifelse(eval(parse(text=paste0("df$",X))) == "Yes", 1, 0)),col.names = c("A","B","C"))

Вывод:

> df
   A B C
1  1 1 0
2  0 1 1
3 NA 0 0
4  1 1 0

Данные

df <-data.frame(A=c('Yes','No',NA,'Yes'),B=c("Yes","Yes","No","Yes"),C=c("No","Yes","No","No"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...