向vector分配元素的问题

时间:2019-01-10 00:18:13

标签: r vector

我编写了一个函数,该函数从列中随机采样一个元素并将该元素分配给向量。

但是,对于结果,我得到的字符元素没有正确采样或分配。例如,字符“企业”将被分配为整数。

我不明白这是因为它起作用:

> example<-c("apple","orange","apple")
> some_vector<-rep(NA,1)
> some_vector[1]<-sample(example,1)
> some_vector
[1] "apple"

我的函数输出将把字符元素转换为“ 5”或“ 9”(一些数字字符)。

示例示例和此处的输出:

> dput(example)
structure(list(age_cat = structure(c(8L, 8L, 9L, 9L), .Label = c("20岁以上30岁以下", 
"20岁以下", "30岁以上40岁以下", "40岁以上50岁以下", 
"50岁以上60岁一下", "60岁以上70岁一下", "70岁以上", 
"50岁以上60岁以下", "60岁以上70岁以下"), class = "factor"), 
    int_trust = structure(c(1L, 2L, 1L, 1L), .Label = c("大多数人是可以信任的", 
    "要越小心越好"), class = "factor")), .Names = c("age_cat", 
"int_trust"), class = "data.frame", row.names = c(NA, 4L))
> rs <- function(df) {
+     set.seed(700)
+     some_vector<-character(2)
+     for (i in 1:2) {
+         some_vector[i]<-sample(df[[i]],1)
+     }
+     # imputed_row<-rbind(some_vector)
+     return(some_vector)
+ }
> rs(example)
[1] "8" "1"

1 个答案:

答案 0 :(得分:0)

问题是因为您的example属于factor

str(example)
#'data.frame':  4 obs. of  2 variables:
#$ age_cat  : Factor w/ 9 levels "20岁以上30岁以下",..: 8 8 9 9
#$ int_trust: Factor w/ 2 levels "大多数人是可以信任的",..: 1 2 1 1

您可以将数据框转换为字符,然后运行该函数,它应该可以正常工作

example[] <- lapply(example, as.character)
rs(example)
#[1] "50岁以上60岁以下"     "大多数人是可以信任的"

但是,如果您希望从每一列中获得一个随机的sample值,则也可以使用sapply / lapply,而无需使用该函数也可以得到相同的结果。

sapply(example, sample, 1)
#           age_cat              int_trust 
#   "50岁以上60岁以下"    "大多数人是可以信任的"