![](/img/trans.png)
[英]how can I lag a column in a data frame into a new column - i.e row 1 becomes row 2 in the new column?
[英]Is there a better (i.e vectorised) way to put part of a column name into a row of a data frame in R
我在R中有一个数据框,它是通过在熔化/浇铸操作的结果上运行一些统计数据而产生的。 我想在包含Nominal值的数据框中添加一行。 每个列的名称中都包含该名义值
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列。 有任何想法吗?
您可以通过两种方式创建temp_nom
(至少):
# strsplit create list so you can sapply on it
sapply(strsplit(names(df),"_"), "[", 2)
# using regular expressions:
sub(".+_|[^_]+", "", names(df))
对于temp_nom
你可以将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)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.