R определяющая функция, чтобы взять столбцы в качестве ввода вместо значения - PullRequest
1 голос
/ 20 марта 2020

У меня есть функция, похожая на эту:

is_nickname = function(first_name1, first_name2, nicknames){
  first_name1_dict_vals <- nicknames[which(nicknames$name ==  first_name1), ]
  first_name2_dict_vals <- nicknames[which(nicknames$name ==  first_name2), ]

  if (rowSums(first_name2 == first_name1_dict_vals) > 0 ) {
    return(1)
  } else if (rowSums(first_name1 == first_name2_dict_vals) > 0 ){
    return (1)
  } else {
    return(0)
    }
}

, которая возвращает 1, если одно из имен совпадает с псевдонимом другого, и 0 в противном случае. Это работает при указании имен как таковых:

is_nickname('will','bill',nicknames)

однако я хотел бы вместо этого передать имена столбцов из фрейма данных. скажем, проверьте $ first_name1 и $ first_name2, которые просто содержат строки для имен в моем наборе данных.

Как бы вы переписали функцию для вывода вектора, соответствующего именам? Я бы вставил этот вектор обратно в фрейм данных 'check' в виде нового столбца с 1 и 0. Спасибо

edit: в фрейме данных псевдонимов есть столбец 'names' и столбцы рядом с ним для соответствующих псевдонимов, который отделен от контрольного фрейма данных.

name<-c('john','bob','sarah','joe')
mm1<-c('jon','rob',NA,'joseph')
mm2<-c('jono','robert',NA,NA)
nicknames_head<-data.frame(name,mm1,mm2)

a1<-c('data','data','data','data')
a2<-c('data','data','data','data')
first_nm1<-c('jon','harry','bob','joe')
first_nm2<-c('john','harry','robert','cain')
is_nickname_should_look_like<-c(1,1,1,0)
check_head<-data.frame(a1,a2,first_nm1, first_nm2,is_nickname_should_look_like)

1 Ответ

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

Нам нужно немного изменить функцию is_nickname для обработки пропущенных значений в nicknames и пустых фреймах данных.

is_nickname = function(first_name1, first_name2, nicknames){

  if(is.na(first_name1) | is.na(first_name2)) return(0)
  first_name1_dict_vals <- nicknames[which(nicknames$name ==  first_name1), ]
  first_name2_dict_vals <- nicknames[which(nicknames$name ==  first_name2), ]

  if (nrow(first_name1_dict_vals) >0 && 
          rowSums(first_name2 == first_name1_dict_vals, na.rm = TRUE) > 0 ) {
       return(1)
   } else if (nrow(first_name2_dict_vals) >0 && 
          rowSums(first_name1 == first_name2_dict_vals, na.rm = TRUE) > 0 ){
       return (1)
   } else {
     return(0)
   }
}

и затем вызовите его, используя mapply

check_head$answer <- mapply(function(x, y) is_nickname(x, y, nicknames_head), 
                     check_head$first_nm1, check_head$first_nm2)

data

Убедитесь, что данные читаются как символы, а не как факторы ,

nicknames_head<-data.frame(name,mm1,mm2, stringsAsFactors = FALSE)
check_head<-data.frame(a1,a2,first_nm1, first_nm2, stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...