Добавьте столбец в DF с «Да», если какой-либо элемент строки имеет значение c в R - PullRequest
1 голос
/ 02 марта 2020

Я пытаюсь избежать очень длинного оператора if_else или даже вложенного для -l oop до go каждой строки и посмотреть на их значения.

Но в основном у меня есть фрейм данных, который выглядит следующим образом (30 столбцов, 50 000 строк):

Col1 Col2  Col3 Col4...Col30
Z     L    D     T     A
D     D    T     Z     X
L     G    T     A     J
....

Если в какой-либо строке есть буква Z, у нового маркера столбца «result» будет «Да». Другое, оно будет иметь номер.

 Col1 Col2  Col3 Col4...Col30  Result
    Z     L    D     T     A    Yes
    D     D    T     Z     X    Yes
    L     G    T     A     J    No
    ....

Ответы [ 3 ]

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

Мы можем создать логическую матрицу с помощью ==, получить rowSums, преобразовать его в логический вектор и изменить его на значения индекса 1, 2 и заменить на «Нет», «Да»

* 1004. *

Или другой вариант: ifelse

df1$Result <- ifelse(rowSums(df1 == "Z") > 0, "Yes", "No")

Или мы можем создать условие с lapply и Reduce

df1$Result <- ifelse(Reduce(`|`, lapply(df1, `==`, "Z")), "Yes", "No")

all три вышеупомянутых метода эффективны, потому что

1) Использование векторизованной опции

2) Не выполнять никаких регулярных выражений, когда мы можем напрямую выполнить сравнение (==)

0 голосов
/ 02 марта 2020

Другое базовое решение R заключается в использовании ifelse + grepl, т. Е.

df$Result <- ifelse(grepl("\\bZ\\b",do.call(paste,df)),"Yes","No")

таким, что

> df
  Col1 Col2 Col3 Col4 Col30 Result
1    Z    L    D    T     A    Yes
2    D    D    T    Z     X    Yes
3    L    G    T    A     J     No

DATA

df <- structure(list(Col1 = c("Z", "D", "L"), Col2 = c("L", "D", "G"
), Col3 = c("D", "T", "T"), Col4 = c("T", "Z", "A"), Col30 = c("A", 
"X", "J")), class = "data.frame", row.names = c(NA, -3L))
0 голосов
/ 02 марта 2020

Вот версия, которая возвращает TRUE и FALSE в новый столбец

df1$Result <- apply(df1, 1, function(r) any(r %in% "Z"))

Или, если вы хотите проверить, содержит ли какой-либо столбец Z или L, вы можете изменить код на следующий

test$Result <- apply(test, 1, function(r) any(r %in% c("Z","L")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...