проверьте, есть ли в столбце фрейма данных пустые ячейки

#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, за исключением любого текста