2010-04-06 4 views
3

У меня есть кадр данных в R, который возник из-за запуска некоторых статистических данных по результату расплава/литье. Я хочу добавить строку в этот фреймворк, содержащий номинальное значение. Это номинальная стоимость присутствует в названиях для каждого столбцаЕсть ли лучший (то есть векторный) способ поместить часть имени столбца в строку кадра данных в R

df<-as.data.frame(cbind(x=c(1,2,3,4,5),`Var A_100`=c(5,4,3,2,1),`Var B_5`=c(9,8,7,6,5))) 
> df 
    x Var A_100 Var B_5 
1 1   5  9 
2 2   4  8 
3 3   3  7 
4 4   2  6 
5 5   1  5 

Итак, я хочу, чтобы создать новую строку, которая содержит «100» в столбце Var A_100 и «5» в Var B_5. В настоящее время это то, что я делаю, но я уверен, что для этого должен быть лучший, векторный способ.

temp_nom<-NULL 
for (l in 1:length(names(df))){ 
temp_nom[l]<-strsplit(names(df),"_")[[l]][2] 
} 
temp_nom 
[1] NA "100" "5" 
df[6,]<-temp_nom 
> df 
    x Var A_100 Var B_5 
1 1   5  9 
2 2   4  8 
3 3   3  7 
4 4   2  6 
5 5   1  5 
6 <NA>  100  5 
rm(temp_nom) 

Обычно у меня было бы 16-24 столбцов. Есть идеи?

ответ

1

Вы можете создать temp_nom двумя способами (по крайней мере):

# strsplit create list so you can sapply on it 
sapply(strsplit(names(df),"_"), "[", 2) 

# using regular expressions: 
sub(".+_|[^_]+", "", names(df)) 

И распайке можно преобразовать temp_nom в числовой (в другом случае связывайтесь с типами столбцов)

df[nrow(df)+1,] <- as.numeric(temp_nom) 

Из Конечно, вы можете сделать это в одной строке:

df[nrow(df)+1,] <- as.numeric(sapply(strsplit(names(df),"_"), "[", 2)) 
# or 
df[nrow(df)+1,] <- as.numeric(sub(".+_|[^_]+", "", names(df)))