3

私は、溶解/キャスト操作の結果についていくつかの統計を実行することで得られた 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

したがって、Var A_100 列に「100」、Var B_5 に「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 の列があります。何か案は?

4

1 に答える 1

1

temp_nom(少なくとも)2つの方法で作成できます。

# 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)

もちろん、1行でそれを行うことができます:

df[nrow(df)+1,] <- as.numeric(sapply(strsplit(names(df),"_"), "[", 2))
# or
df[nrow(df)+1,] <- as.numeric(sub(".+_|[^_]+", "", names(df)))
于 2010-04-06T13:11:07.670 に答える