Как добавить столбец в середине кадра данных R? Я хочу посмотреть, есть ли у меня столбец с именем "LastName", а затем добавить его в качестве третьего столбца, если он еще не существует.
Существует ли столбец и как изменить порядок столбцов в кадре данных R
Ответ 1
1) Тестирование на существование: используйте% in% на именах кодов, например.
> example(data.frame) # to get 'd'
> "fac" %in% colnames(d)
[1] TRUE
> "bar" %in% colnames(d)
[1] FALSE
2) Вам по существу нужно создать новый data.frame из первой половины старого, вашего нового столбца и второй половины:
> bar <- data.frame(d[1:3,1:2], LastName=c("Flim", "Flom", "Flam"), fac=d[1:3,3])
> bar
x y LastName fac
1 1 1 Flim C
2 1 2 Flom A
3 1 3 Flam A
>
Ответ 2
Один из подходов состоит в том, чтобы просто добавить столбец в конец кадра данных, а затем использовать подмножество, чтобы переместить его в нужную позицию:
d$LastName <- c("Flim", "Flom", "Flam")
bar <- d[c("x", "y", "Lastname", "fac")]
Ответ 3
Из многих глупых вспомогательных функций, которые я написал, это используется каждый раз, когда я загружаю R. Он просто составляет список имен столбцов и индексов, но я постоянно их использую.
##creates an object from a data.frame listing the column names and location
namesind=function(df){
temp1=names(df)
temp2=seq(1,length(temp1))
temp3=data.frame(temp1,temp2)
names(temp3)=c("VAR","COL")
return(temp3)
rm(temp1,temp2,temp3)
}
ni <- namesind
Используйте ni для просмотра номеров столбцов. (ni - просто псевдоним для имен, я никогда не использую имена, но думал, что это было лучшее имя изначально). Затем, если вы хотите вставить свой столбец в строке 12, а ваш data.frame называется bob с 20 столбцами, это будет
bob2 < - data.frame(bob [, 1:11], newcolumn, bob [, 12: 20]
хотя мне понравилось добавление в конце и ответить на вопрос от Хэдли.
Ответ 4
Ответ Dirk Eddelbuettel работает, но вам не нужно указывать номера строк или указывать записи в столбце lastname. Этот код должен сделать это для фрейма данных с именем df
:
if(!("LastName" %in% names(df))){
df <- cbind(df[1:2],LastName=NA,df[3:length(df)])
}
(по умолчанию от LastName
до NA
, но вы можете так же легко использовать "LastName='Smith'
" )
Ответ 5
или с помощью cbind:
> example(data.frame) # to get 'd'
> bar <- cbind(d[1:3,1:2],LastName=c("Flim", "Flom", "Flam"),fac=d[1:3,3])
> bar
x y LastName fac
1 1 1 Flim A
2 1 2 Flom B
3 1 3 Flam B
Ответ 6
Я всегда думал, что что-то вроде append() [хотя и неудачное имя] должно быть общей функцией
## redefine append() as generic function
append.default <- append
append <- `body<-`(args(append),value=quote(UseMethod("append")))
append.data.frame <- function(x,values,after=length(x))
`row.names<-`(data.frame(append.default(x,values,after)),
row.names(x))
## apply the function
d <- (if( !"LastName" %in% names(d) )
append(d,values=list(LastName=c("Flim","Flom","Flam")),after=2) else d)