mapply дает ненулевой аргумент c для ошибки бинарного оператора в R - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь создать переменную, помечающую неправдоподобные возрастные различия между респондентами и их родителями в реестре домохозяйств. mapply () выдает ошибку «аргумент non-Numberri c для бинарного оператора», хотя я не получаю эту ошибку, когда применяю функцию только к двум столбцам. Любая помощь очень ценится. Ниже я постарался сделать воспроизводимый пример.


# Variables
respbirth <- c(1974, 1950, 1990, 1980 ) 
B1010_1 <- c(1950, 1960, 1960, 1979 ) 
B1040_1 <- c(3,3,3,3)
B1010_2 <- c(1974, NA, NA, 1975 ) 
B1040_2 <- c(3,1,3,3)

# Data frame
df <- data.frame(respbirth, B1010_1, B1040_1, B1010_2, B1040_2 ) 
df

# Generate empty variable for flaging cases
df$flag_parent <- FALSE

## Generate a function flagging implausible differences using year of birth
attach(df)  # the function doesnt work without this for some reason
imp.parent <- function(data=df,parentAge=B1010_1,relationship=B1040_1) {
  df$flag_parent <- with(df, ((respbirth-parentAge)<18) & (relationship==3))
return(df)
}

# Test
df <- imp.parent(parentAge=B1010_1,relationship=B1040_1)

# Apply this function to all columns
parentAge <- c(paste0("B1010_",1:19, sep=""))
relationship <- c(paste0("B1040_",1:19, sep=""))
mapply(imp.parent, parentAge, relationship )

1 Ответ

0 голосов
/ 05 февраля 2020

В настоящее время существует множество проблем с вашей попыткой mapply, включая типы параметров, вызов функции, возвращаемые значения и другие. Чтобы избежать длинного перечисления этих проблем, рассмотрите приведенный ниже переработанный код.

# Generate a function flagging implausible differences using year of birth
imp.parent <- function(parentAge, relationship, data=df) {    
  ((df$respbirth - df[[parentAge]]) < 18) & (df[[relationship]] == 3)  
}

# Apply this function to all columns
parentAge <- c(paste0("B1010_", 1:2))
relationship <- c(paste0("B1040_", 1:2))

# Assign columns True/False
df[paste0("false_flag_", 1:2)] <- mapply(imp.parent, parentAge, relationship )

df    
#   respbirth B1010_1 B1040_1 B1010_2 B1040_2 false_flag_1 false_flag_2
# 1      1974    1950       3    1974       3        FALSE         TRUE
# 2      1950    1960       3      NA       1         TRUE        FALSE
# 3      1990    1960       3      NA       3        FALSE           NA
# 4      1980    1979       3    1975       3         TRUE         TRUE

На самом деле, вам даже не нужно mapply (скрытый l oop)! R может вычислить логическое условие для блоков данных равной длины для векторизованного назначения блока столбцов:

# Apply this function to all columns
parentAge <- c(paste0("B1010_", 1:2))
relationship <- c(paste0("B1040_", 1:2))

# NOTICE USE OF `[` (NOT `[[`)
df[paste0("false_flag_", 1:2)] <- ((df$respbirth - df[parentAge]) < 18) & (df[relationship] == 3) 

df    
#   respbirth B1010_1 B1040_1 B1010_2 B1040_2 false_flag_1 false_flag_2
# 1      1974    1950       3    1974       3        FALSE         TRUE
# 2      1950    1960       3      NA       1         TRUE        FALSE
# 3      1990    1960       3      NA       3        FALSE           NA
# 4      1980    1979       3    1975       3         TRUE         TRUE

Демонстрация в режиме онлайн

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...