#r
#r
Вопрос:
Я проверяю, есть ли в моем столбце (имени) какая-либо пустая ячейка, но получаю ошибку. любое решение ….??? я пытаюсь таким образом …. также, как я могу игнорировать, есть ли в этой ячейке пробел, я имею в виду удалить пробел, если в этой ячейке есть, затем проверьте, пусто ли значение t, я просто не хочу изменять столбец исходного имени, при проверке я просто хочу удалить пробелы или NA и проверить, пусты ли ячейки.
df8 <- data.frame(name=c("try,xab","xab,Lan","mhy,mun","vgtu,mmc","dgsy,aaf","kull,nnhu","hula,njam","mund,jiha","htfy,ntha","","sgyu,hytb","vdti,kula","mftyu,huta","","cday,bhsue","ajtu,nudj"),
email=c("xab.try@ybcd.com","Lan.xab@ybcd.com","tth.vgu@ybcd.com","mmc.vgtu@ybcd.com","aaf.dgsy@ybcd.com","nnhu.kull@ybcd.com","njam.hula@ybcd.com","jiha.mund@ybcd.com","ntha.htfy@ybcd.com","gydbt.bhr@ybcd.com","hytb.sgyu@ybcd.com","kula.vdti@ybcd.com","huta.mftyu@ybcd.com","ggat.khul@ybcd.com","bhsue.cday@ybcd.com","nudj.ajtu@ybcd.com"))
df8 <- df8 %>% mutate(is_blank_node = which(df8$name == "", arr.ind = TRUE),1 )
Error:
Error: Problem with mutate() input is_blank_node.
x Input is_blank_name can't be recycled to size 182753.
i Input is_blank_name is which(df$Name == "", arr.ind = TRUE).
i Input is_blank_name must be size 182753 or 1, not 0.
ожидаемый результат
Комментарии:
1.
df8$is_empty <- df8$name == ''
?2. да, но я хочу, чтобы новый столбец был изменен на 1 и 0
3. Пожалуйста, покажите ожидаемый результат для ваших данных.
4. я только что обновил свой вопрос
5. Не так ли
df8$is_blank_node <- as.integer(df8$name == '')
?
Ответ №1:
Может быть, вы можете попробовать nchar
, как показано ниже
df8 %>%
mutate(is_blank_node = (nchar(name)==0))
или nzchar
df8 %>%
mutate(is_blank_node = !nzchar(name))
что дает
> df8 %>%
mutate(is_blank_node = (nchar(name)==0))
name email is_blank_node
1 try,xab xab.try@ybcd.com 0
2 xab,Lan Lan.xab@ybcd.com 0
3 mhy,mun tth.vgu@ybcd.com 0
4 vgtu,mmc mmc.vgtu@ybcd.com 0
5 dgsy,aaf aaf.dgsy@ybcd.com 0
6 kull,nnhu nnhu.kull@ybcd.com 0
7 hula,njam njam.hula@ybcd.com 0
8 mund,jiha jiha.mund@ybcd.com 0
9 htfy,ntha ntha.htfy@ybcd.com 0
10 gydbt.bhr@ybcd.com 1
11 sgyu,hytb hytb.sgyu@ybcd.com 0
12 vdti,kula kula.vdti@ybcd.com 0
13 mftyu,huta huta.mftyu@ybcd.com 0
14 ggat.khul@ybcd.com 1
15 cday,bhsue bhsue.cday@ybcd.com 0
16 ajtu,nudj nudj.ajtu@ybcd.com 0
Ответ №2:
Вам вообще не нужно which
. Фактически, это вызывает ошибку здесь, поскольку результат имеет длину 2 (учитываются только TRUE
значения) и возвращает позицию только положительных результатов вашего теста. mutate
можно получить результат из name == ""
напрямую. dplyr
также уже известно, что вы оцениваете столбец name
внутри df8
. Таким образом, вы можете (и должны) опустить df$
:
df8 <- data.frame(name=c("try,xab","xab,Lan","mhy,mun","vgtu,mmc","dgsy,aaf","kull,nnhu","hula,njam","mund,jiha","htfy,ntha","","sgyu,hytb","vdti,kula","mftyu,huta","","cday,bhsue","ajtu,nudj"),
email=c("xab.try@ybcd.com","Lan.xab@ybcd.com","tth.vgu@ybcd.com","mmc.vgtu@ybcd.com","aaf.dgsy@ybcd.com","nnhu.kull@ybcd.com","njam.hula@ybcd.com","jiha.mund@ybcd.com","ntha.htfy@ybcd.com","gydbt.bhr@ybcd.com","hytb.sgyu@ybcd.com","kula.vdti@ybcd.com","huta.mftyu@ybcd.com","ggat.khul@ybcd.com","bhsue.cday@ybcd.com","nudj.ajtu@ybcd.com"))
library(tidyverse)
df8 %>%
mutate(is_blank_node = name == "")
#> name email is_blank_node
#> 1 try,xab xab.try@ybcd.com FALSE
#> 2 xab,Lan Lan.xab@ybcd.com FALSE
#> 3 mhy,mun tth.vgu@ybcd.com FALSE
#> 4 vgtu,mmc mmc.vgtu@ybcd.com FALSE
#> 5 dgsy,aaf aaf.dgsy@ybcd.com FALSE
#> 6 kull,nnhu nnhu.kull@ybcd.com FALSE
#> 7 hula,njam njam.hula@ybcd.com FALSE
#> 8 mund,jiha jiha.mund@ybcd.com FALSE
#> 9 htfy,ntha ntha.htfy@ybcd.com FALSE
#> 10 gydbt.bhr@ybcd.com TRUE
#> 11 sgyu,hytb hytb.sgyu@ybcd.com FALSE
#> 12 vdti,kula kula.vdti@ybcd.com FALSE
#> 13 mftyu,huta huta.mftyu@ybcd.com FALSE
#> 14 ggat.khul@ybcd.com TRUE
#> 15 cday,bhsue bhsue.cday@ybcd.com FALSE
#> 16 ajtu,nudj nudj.ajtu@ybcd.com FALSE
Создано 2020-09-17 пакетом reprex (версия 0.3.0)
Обновить
TRUE
и FALSE
в основном эквивалентны 1
и 0
только logical
вместо integer
/ numeric
типа. Вы можете попробовать это с помощью, TRUE * 1
которая превращает logical
в numeric
значение. Или используйте as.integer
напрямую. Чтобы обойти проблему заполнения ячеек только пробелами или NA
вы также можете включить дополнительные шаги. Поскольку это становится немного подробным, мы можем обернуть это в функцию:
check_blank <- function(x) {
as.integer(trimws(ifelse(is.na(x), "", x)) == "")
}
df8 %>%
mutate(is_blank_node = check_blank(name))
#> name email is_blank_node
#> 1 try,xab xab.try@ybcd.com 0
#> 2 xab,Lan Lan.xab@ybcd.com 0
#> 3 mhy,mun tth.vgu@ybcd.com 0
#> 4 vgtu,mmc mmc.vgtu@ybcd.com 0
#> 5 dgsy,aaf aaf.dgsy@ybcd.com 0
#> 6 kull,nnhu nnhu.kull@ybcd.com 0
#> 7 hula,njam njam.hula@ybcd.com 0
#> 8 mund,jiha jiha.mund@ybcd.com 0
#> 9 htfy,ntha ntha.htfy@ybcd.com 0
#> 10 gydbt.bhr@ybcd.com 1
#> 11 sgyu,hytb hytb.sgyu@ybcd.com 0
#> 12 vdti,kula kula.vdti@ybcd.com 0
#> 13 mftyu,huta huta.mftyu@ybcd.com 0
#> 14 ggat.khul@ybcd.com 1
#> 15 cday,bhsue bhsue.cday@ybcd.com 0
#> 16 ajtu,nudj nudj.ajtu@ybcd.com 0
Создано 2020-09-17 пакетом reprex (версия 0.3.0)
Комментарии:
1. но я хочу, чтобы этот столбец is_blank_node был равен 1 для True и 0 для false
2. @sanuali0123
as.integer(TRUE)
3. df8 <- df8 %>% as.integer(мутировать (is_blank_node = name == «»), TRUE) таким образом …??
4. Я обновил ответ. Как правило, имеет смысл упомянуть ожидаемый результат в вопросе, только на будущее 🙂
5. я только что обновил свой вопрос сейчас … у меня есть еще один добавленный сценарий
Ответ №3:
Базовое решение R, проверяющее, есть ли пустые строки во всех векторах:
data.frame( (t(apply(df8, 1, `==`, ""))))
База R со столбцом результатов — привязка к исходным данным.фрейм:
cbind(df8, setNames(data.frame( (t(apply(df8, 1, `==`, "")))),
paste("empty", names(df8), sep = "_")))
Ответ №4:
Это изменит указанный столбец с вашими желаемыми значениями (1 или 0)
df8 <- df8 %>% mutate(is_blank_node = ifelse(name == "", 1, 0))
Обновление: добавлена строка, которая удаляет все пробелы из столбца, а затем проверяет, пуста ли ячейка…
df8 <- df8 %>%
mutate(name = trimws(name, which = "both")) %>%
mutate(is_blank_node = ifelse(name == "", 1, 0))
Обновление 2: это даст ‘1’ для любой ячейки, обнаруженной как пустая или содержащей только пробелы (независимо от количества пробелов), и даст ‘0’ для чего-либо еще. Это не изменяет содержимое исходного столбца.
library(tidyverse)
df8 <- df8 %>% mutate(is_blank_node = ifelse(name == "" | str_detect(name, '^\s*$'), 1, 0))
Комментарии:
1. спасибо, за простое решение, но одно новое изменение: я не хочу изменять столбец name, но я просто хочу опустить пробелы при проверке пустых ячеек. я имею в виду, что при проверке пустых ячеек я просто хочу игнорировать пробелы, но не хочу изменять исходный столбец
2. итак, скажем, если ячейка была проверена, и в ней был только один пробел и ничего больше (она выглядит пустой, но имеет пробел), вы бы хотели, чтобы новый столбец возвращал 1 или 0?
3. если ячейка пуста или содержит только пробел NA, она должна быть равна 1, за исключением любого текста