我有像
这样的数据集名称no names
1 Anu
2 Bhanwarlal
3 Millennium
4 NA
5 Mushkil
6 NA
7 Niraj
8 NA
9 Dharmender
10 S
11 Hocalwire
12 Mansoor
girl
no name
1 Anu
2 Komal
3 Piyu
boy
no name
1 Amit
2 Niraj
3 Dharmendra
4 Monsoor
5 Akash
样本数据集可以创建为:
# set up a vector of names
names <- c('Anu', 'Bhanwarlal', 'Komal', NA, 'Mushkil', NA, 'Niraj', NA, 'Dharmendra', 'S', 'Amit', 'Monsoor')
# set up a vector of female names
girls <- c('Anu', 'Komal', 'Piyu')
# set up a vector of male names
boys <- c('Amit', 'Niraj', 'Dharmendra', 'Monsoor', 'Akash')
我有数据集名称。如果姓名在男孩或女孩中,则通过在名称数据集中添加一列来为此名称指定男性或女性。
gender <- function(names,boy,girl){
for(i in 1:nrow(names)){
if(names[i,1] %in% girl$name){
names$gen[i] <- "Female"
} else if(names[i,1] %in% boy$name){
names$gen[i]<- "Male"
} else
names$gen[i] <- "NA"
}
}
gen <- gender(names,boy,girl)
输出:
> gen
NULL
我无法找到可能的错误。
答案 0 :(得分:0)
以下是进行分析的快捷方法:
# names
names <- c('Anu', 'Bhanwarlal', 'Komal', NA, 'Mushkil', NA, 'Niraj', NA, 'Dharmendra', 'S', 'Amit', 'Monsoor')
girls <- c('Anu', 'Komal', 'Piyu', 'Anu')
boys <- c('Amit', 'Niraj', 'Dharmendra', 'Monsoor', 'Akash')
# dataframes
name <- tibble::data_frame(names, gen = NA)
girl <- tibble::data_frame(name = girls, gender = rep('Female', length(girls)))
boy <- tibble::data_frame(name = boys, gender = rep('Male', length(boys)))
map_names <- rbind(girl, boy)
# function
gender <- function(names, map_names){
n <- nrow(names)
for(i in seq_len(n)){
k <- which(names[[i, 1]] == map_names$name)
if (length(k) != 0) {
if (length(k) > 1) {
k <- k[1]
}
names[[2]][i] <- map_names$gender[k]
} else {
names[[2]][i] <- 'NA'
}
}
colnames(names) <- c('names', 'gender')
return(names)
}
#output
gen <- gender(name, map_names)
gen
# A tibble: 12 × 2
names gender
<chr> <chr>
1 Anu Female
2 Bhanwarlal NA
3 Komal Female
4 <NA> NA
5 Mushkil NA
6 <NA> NA
7 Niraj Male
8 <NA> NA
9 Dharmendra Male
10 S NA
11 Amit Male
12 Monsoor Male
答案 1 :(得分:0)
正如Jovial Mann的回答中所提到的,你的问题是没有告诉用户定义的函数它应该返回任何输出。要解决这个问题,只需在函数的最后一行添加names
,您就会看到一些输出。
接下来,您可以使用'sapply'功能来避免使用for循环。
# set up a vector of names
names <- c('Anu', 'Bhanwarlal', 'Komal', NA, 'Mushkil', NA, 'Niraj', NA, 'Dharmendra', 'S', 'Amit', 'Monsoor')
# set up a vector of female names
girls <- c('Anu', 'Komal', 'Piyu')
# set up a vector of male names
boys <- c('Amit', 'Niraj', 'Dharmendra', 'Monsoor', 'Akash')
# create a gender assigning function
gender <- function(names, femaleNames, maleNames)
{
# create a placeholder dataframe
data <- data.frame(names = names, gender = NA)
# when name is found in vector of female names, assign gender female
data$gender[sapply(names,"%in%", femaleNames)] <- "Female"
# when name is found in vector of male names, assign gender male
data$gender[sapply(names, "%in%", maleNames)] <- "Male"
# return data frame with names and gender
data
}
# see the output
gender(names, girls, boys)