![](/img/trans.png)
[英]What is the most efficient way to add a column that is a binary indicator of a recurring number in time series dataframe?
[英]what is the most efficient way to move a column in a dataframe
我想將右側的列移動到數據框左側的某個位置。 由於我只移動一列,所以我有很多列。 我認為像這樣的df <-df [,c(“ a”,“ b”,“ d”,“ c”)]]重新排序不會有效。 由於數據框包含許多行,所以我想盡量減少重寫
從:
name var1 var2 var3 var4 var5 ... varN
a 1 1 1 1 1 1
b 1 1 1 1 1 1
c 1 1 1 1 1 1
至:
name var1 varN var2 var3 var4 ... varN-1
a 1 1 1 1 1 1
b 1 1 1 1 1 1
c 1 1 1 1 1 1
您可以使用列索引的向量而不是列名稱的向量,因此可以利用序列表示法,如下所示:
my_seq = c(1,ncol(df),2:(ncol(df)-1))
df[,my_seq]
例如,如果您的數據框有17列,我們將得到:
> my_seq
[1] 1 17 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
您可以使用append
到達那里:
df <- data.frame(name=letters[1:5],var1=1,var2=1,var3=1,var4=1,var5=1)
# using names
df[append(names(df)[-ncol(df)], names(df)[ncol(df)], after=2)]
# using positions
df[append(seq(ncol(df)-1), ncol(df), after=2)]
# name var1 var5 var2 var3 var4
#1 a 1 1 1 1 1
#2 b 1 1 1 1 1
#3 c 1 1 1 1 1
#4 d 1 1 1 1 1
#5 e 1 1 1 1 1
我建議從“ SOfun”包中查看moveMe
函數 。
有了它,解決方案將類似於:
df <- data.frame(name=letters[1:5],var1=1,var2=1,var3=1,var4=1,var5=1)
library(SOfun)
df[moveMe(names(df), "var5 before var4")]
# name var1 var2 var3 var5 var4
# 1 a 1 1 1 1 1
# 2 b 1 1 1 1 1
# 3 c 1 1 1 1 1
# 4 d 1 1 1 1 1
# 5 e 1 1 1 1 1
您還可以復合語句:
df[moveMe(names(df), "var5 before var2; name last")]
# var1 var5 var2 var3 var4 name
# 1 1 1 1 1 1 a
# 2 1 1 1 1 1 b
# 3 1 1 1 1 1 c
# 4 1 1 1 1 1 d
# 5 1 1 1 1 1 e
如果要最有效地執行此操作,則應考慮將數據轉換為“ data.table”,並使用setcolorder
。 這將通過引用而不是通過復制數據來更改列順序。
library(data.table)
dt <- as.data.table(df)
setcolorder(dt, moveMe(names(dt), "var5 before var4"))
dt
# name var1 var2 var3 var5 var4
# 1: a 1 1 1 1 1
# 2: b 1 1 1 1 1
# 3: c 1 1 1 1 1
# 4: d 1 1 1 1 1
# 5: e 1 1 1 1 1
與dplyr
df %>% select(name,var1,varN,everthing())
如果數據幀df
有n
列,並且您必須從開始將第m
列移到第二個位置
df <- subset(df, select=c(1, m, 2:m-1, m+1:n))
在您的情況下:
df <- subset(df, select=c(name:var1, varN, var2:varN-1))
它也可以寫成:
df <- subset(df, select=c(name, var1, varN, var2, var3,....,varN-1))
您可以使用列名和列號來傳遞新的列順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.