2016-07-19 3 views
2

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

df <- data.frame(x = 1:5) # create simple dataframe 
df 
    x 
1 1 
2 2 
3 3 
4 4 
5 5 

df$y <- c(1:5) # adding a new column with a vector of the exact same length. Works out like it should 
df 
x y 
1 1 1 
2 2 2 
3 3 3 
4 4 4 
5 5 5 

df$z <- c(1:4) # trying to add a new colum, this time with a vector with less elements than there are rows in the dataframe. 

Error in `$<-.data.frame`(`*tmp*`, "z", value = 1:4) : 
    replacement has 4 rows, data has 5 

Я ожидал этого, чтобы работать со следующим результатом:

x y z 
1 1 1 1 
2 2 2 2 
3 3 3 3 
4 4 4 4 
5 5 5 1 

Т.е. более короткий вектор должен начинать автоматически повторяться. Я почти уверен, что это работало для меня (это в сценарии, который я запускал сто раз раньше, без проблем). Теперь я даже не могу заставить приведенный выше фиктивный пример работать так, как я хочу. Что мне не хватает?

ответ

3

Если вектор может быть равномерно переработаны, в data.frame, вы не получите и ошибку или предупреждение:

df <- data.frame(x = 1:10) 
df$z <- 1:5 

Это может быть то, что вы испытывали раньше.

Вы можете получить свой вектор, чтобы соответствовать, как вы говорите с rep_len:

df$y <- rep_len(1:3, length.out=10) 

Это приводит к

df 
    x z y 
1 1 1 1 
2 2 2 2 
3 3 3 3 
4 4 4 1 
5 5 5 2 
6 6 1 3 
7 7 2 1 
8 8 3 2 
9 9 4 3 
10 10 5 1 

Обратите внимание, что вместо rep_len, вы могли бы использовать более общие rep функции:

df$y <- rep(1:3,len=10) 

Из файла справки для rep:

rep.int и rep_len быстрее упрощенные версии для двух общих случаев. Они не общие.

+0

Спасибо. Ты был прав. Я думал, что это была какая-то странная ошибка, потому что, как я уже сказал, я запускал этот скрипт сто раз. И так как я запускаю скрипт на наборах данных разных размеров, я обнаружил маловероятным, что количество строк данных было последовательно кратно длине вектора. Но я получаю. По дизайну. Предполагалось, что это так, поэтому я в конце концов обнаружил, что корень ошибки был расположен где-то в другом месте. –

1

Если общее количество строк кратно длине вашего нового вектора, оно отлично работает. Когда это не так, это не работает повсюду. В частности, вероятно, вы использовали этот тип переработки с помощью матриц:

data.frame(1:6, 1:3, 1:4) # not a multiply 
# Error in data.frame(1:6, 1:3, 1:4) : 
# arguments imply differing number of rows: 6, 3, 4 
data.frame(1:6, 1:3) # a multiple 
# X1.6 X1.3 
# 1 1 1 
# 2 2 2 
# 3 3 3 
# 4 4 1 
# 5 5 2 
# 6 6 3 
cbind(1:6, 1:3, 1:4) # works even with not a multiple 
#  [,1] [,2] [,3] 
# [1,] 1 1 1 
# [2,] 2 2 2 
# [3,] 3 3 3 
# [4,] 4 1 4 
# [5,] 5 2 1 
# [6,] 6 3 2 
# Warning message: 
# In cbind(1:6, 1:3, 1:4) : 
# number of rows of result is not a multiple of vector length (arg 3) 
Смежные вопросы