Вы можете использовать:
ddply(baseball, .(id, year), function(x){data.frame(paste(x$id,x$year,sep="_"))})
Когда вы возвращаете вектор, собирая его обратно в виде data.frame, каждая запись становится столбцом.Но есть разные длины, поэтому они не имеют одинаковое количество столбцов.Обернув его в data.frame()
, вы убедитесь, что ваша функция возвращает data.frame
с нужным столбцом, а не полагается на неявное (и в данном случае неправильное) преобразование.Кроме того, вы можете легко назвать новый столбец в этой конструкции.
ОБНОВЛЕНИЕ:
Если вы хотите оценить функцию только один раз (что разумно), то вы можете просто потянуть первую строкуи работать над этим.
ddply(baseball, .(id, year), function(x) {
x <- x[1,]
paste(x$id, x$year, sep="_")
})
Это (само по себе) будет иметь только одну строку для каждой комбинации id / year.Если вы хотите, чтобы в нем было столько же строк, сколько в оригинале, вы можете объединить это с предыдущей идеей.
ddply(baseball, .(id, year), function(x) {
firstrow <- x[1,]
data.frame(label=rep(paste(firstrow$id, firstrow$year, sep="_"), nrow(x)))
})