Подтвердить что ты не робот

Создание кадра данных из двух векторов с использованием cbind

Рассмотрим следующий код R.

> x = cbind(c(10, 20), c("[]", "[]"), c("[[1,2]]","[[1,3]]"))
> x
     [,1] [,2] [,3]     
[1,] "10" "[]" "[[1,2]]"
[2,] "20" "[]" "[[1,3]]"

Аналогично

> x = rbind(c(10, "[]", "[[1,2]]"), c(20, "[]", "[[1,3]]"))
> x
     [,1] [,2] [,3]     
[1,] "10" "[]" "[[1,2]]"
[2,] "20" "[]" "[[1,3]]"

Теперь я не хочу, чтобы целые числа 10 и 20 были преобразованы в строки. Как я могу выполнить эту операцию без такого преобразования? Я бы Конечно, также хотелось бы знать, почему это преобразование происходит. я посмотрел на помощь cbind, а также попробовал Googling, но не повезло найти решение. Я также считаю, что в некоторых случаях. R преобразует строки в факторов, и я не хочу, чтобы это произошло, хотя это не кажется чтобы быть здесь.

4b9b3361

Ответ 1

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

(Обратите внимание, что в вашем примере rbind продвижение происходит в вызове c:

> c(10, "[]", "[[1,2]]")
[1] "10"      "[]"      "[[1,2]]"

Если вам нужна прямоугольная структура, где столбцы могут быть разных типов, вы хотите data.frame. Любое из следующего должно получить то, что вы хотите:

> x = data.frame(v1=c(10, 20), v2=c("[]", "[]"), v3=c("[[1,2]]","[[1,3]]"))
> x
  v1 v2      v3
1 10 [] [[1,2]]
2 20 [] [[1,3]]
> str(x)
'data.frame':   2 obs. of  3 variables:
 $ v1: num  10 20
 $ v2: Factor w/ 1 level "[]": 1 1
 $ v3: Factor w/ 2 levels "[[1,2]]","[[1,3]]": 1 2

или (используя специально data.frame версию cbind)

> x = cbind.data.frame(c(10, 20), c("[]", "[]"), c("[[1,2]]","[[1,3]]"))
> x
  c(10, 20) c("[]", "[]") c("[[1,2]]", "[[1,3]]")
1        10            []                 [[1,2]]
2        20            []                 [[1,3]]
> str(x)
'data.frame':   2 obs. of  3 variables:
 $ c(10, 20)              : num  10 20
 $ c("[]", "[]")          : Factor w/ 1 level "[]": 1 1
 $ c("[[1,2]]", "[[1,3]]"): Factor w/ 2 levels "[[1,2]]","[[1,3]]": 1 2

или (используя cbind, но создавая первый a data.frame, чтобы он объединялся в качестве data.frames do):

> x = cbind(data.frame(c(10, 20)), c("[]", "[]"), c("[[1,2]]","[[1,3]]"))
> x
  c.10..20. c("[]", "[]") c("[[1,2]]", "[[1,3]]")
1        10            []                 [[1,2]]
2        20            []                 [[1,3]]
> str(x)
'data.frame':   2 obs. of  3 variables:
 $ c.10..20.              : num  10 20
 $ c("[]", "[]")          : Factor w/ 1 level "[]": 1 1
 $ c("[[1,2]]", "[[1,3]]"): Factor w/ 2 levels "[[1,2]]","[[1,3]]": 1 2

Ответ 2

Использование data.frame вместо cbind должно быть полезно

x <- data.frame(col1=c(10, 20), col2=c("[]", "[]"), col3=c("[[1,2]]","[[1,3]]"))
x
  col1 col2    col3
1   10   [] [[1,2]]
2   20   [] [[1,3]]

sapply(x, class) # looking into x to see the class of each element
     col1      col2      col3 
"numeric"  "factor"  "factor" 

Как вы можете видеть, элементы из col1 numeric по вашему желанию.

data.frame могут иметь переменные разных class: numeric, factor и character, но matrix не будет, как только вы поместите элемент character в матрицу, все остальные станут в этот класс, независимо от того, кем они были раньше.