提取具有特定条件的数据框行
Extract data frame rows with certain conditions
我有一个数据框,V1
和V2
两个变量,有9行数据。
Original Data Frame:
Var1 Var2
sigma1 11 1
alpha1 12 5
pi1 13 3
sigma2 14 4
alpha2 21 9
pi2 34 6
sigma3 55 12
alpha3 18 9
pi3 19 10
我想分离所有对 alpha、sigma 和 pi 的观察。并使它们中的每一个成为一个新的数据框。
Ideal format afterwards:
Data Frame 1:
sigma1 11 1
sigma2 14 4
sigma3 55 12
Data Frame 2:
alpha1 12 5
alpha2 21 9
alpha3 18 9
Data Frame 3:
pi1 13 3
pi2 34 6
pi3 19 10
我想分离所有对 alpha、sigma 和 pi 的观察。并使它们中的每一个成为一个新的数据框。
如果你转换为 data.table
,你可以这样做:(我正在调用你的第一列的名称 letter
)
DT <- as.data.table(DF)
DT[grep('sigma.*', DT[, letter])]
然后你可以和其他人做同样的事情。
我将从第一个字母创建一个分组变量,并将其与拆分一起使用:
df <- read.table(header=T, text='
group Var1 Var2
sigma1 11 1
alpha1 12 5
pi1 13 3
sigma2 14 4
alpha2 21 9
pi2 34 6
sigma3 55 12
alpha3 18 9
pi3 19 10
')
split(df, substr(df$group,0,1))
给这个:
> split(df, substr(df$group,0,1))
$a
group Var1 Var2
2 alpha1 12 5
5 alpha2 21 9
8 alpha3 18 9
$p
group Var1 Var2
3 pi1 13 3
6 pi2 34 6
9 pi3 19 10
$s
group Var1 Var2
1 sigma1 11 1
4 sigma2 14 4
7 sigma3 55 12
我们可以使用eval(parse())
创建动态变量,试试这个例子:
#dummy data
df <- read.table(text="Var1 Var2
sigma1 11 1
alpha1 12 5
pi1 13 3
sigma2 14 4
alpha2 21 9
pi2 34 6
sigma3 55 12
alpha3 18 9
pi3 19 10")
#get unique rownames
myNames <- unique(gsub(".$", "", rownames(df)))
myNames
#[1] "sigma" "alpha" "pi"
#split to 3 data.frames
for(i in myNames)
eval(parse(text=paste0("df_",i," <- df[ grepl('",i,"',rownames(df)),]")))
#check output
ls()
# [1] "df" "df_alpha" "df_pi" "df_sigma" "i" "myNames"
df_alpha
# Var1 Var2
# alpha1 12 5
# alpha2 21 9
# alpha3 18 9
编辑:
正如@NealFultz 建议的那样,为了提高代码的可读性,我们可以使用 assign:
for(i in myNames)
assign(paste0("df_",i),df[ grepl(i,rownames(df)),])
我有一个数据框,V1
和V2
两个变量,有9行数据。
Original Data Frame:
Var1 Var2
sigma1 11 1
alpha1 12 5
pi1 13 3
sigma2 14 4
alpha2 21 9
pi2 34 6
sigma3 55 12
alpha3 18 9
pi3 19 10
我想分离所有对 alpha、sigma 和 pi 的观察。并使它们中的每一个成为一个新的数据框。
Ideal format afterwards:
Data Frame 1:
sigma1 11 1
sigma2 14 4
sigma3 55 12
Data Frame 2:
alpha1 12 5
alpha2 21 9
alpha3 18 9
Data Frame 3:
pi1 13 3
pi2 34 6
pi3 19 10
我想分离所有对 alpha、sigma 和 pi 的观察。并使它们中的每一个成为一个新的数据框。
如果你转换为 data.table
,你可以这样做:(我正在调用你的第一列的名称 letter
)
DT <- as.data.table(DF)
DT[grep('sigma.*', DT[, letter])]
然后你可以和其他人做同样的事情。
我将从第一个字母创建一个分组变量,并将其与拆分一起使用:
df <- read.table(header=T, text='
group Var1 Var2
sigma1 11 1
alpha1 12 5
pi1 13 3
sigma2 14 4
alpha2 21 9
pi2 34 6
sigma3 55 12
alpha3 18 9
pi3 19 10
')
split(df, substr(df$group,0,1))
给这个:
> split(df, substr(df$group,0,1))
$a
group Var1 Var2
2 alpha1 12 5
5 alpha2 21 9
8 alpha3 18 9
$p
group Var1 Var2
3 pi1 13 3
6 pi2 34 6
9 pi3 19 10
$s
group Var1 Var2
1 sigma1 11 1
4 sigma2 14 4
7 sigma3 55 12
我们可以使用eval(parse())
创建动态变量,试试这个例子:
#dummy data
df <- read.table(text="Var1 Var2
sigma1 11 1
alpha1 12 5
pi1 13 3
sigma2 14 4
alpha2 21 9
pi2 34 6
sigma3 55 12
alpha3 18 9
pi3 19 10")
#get unique rownames
myNames <- unique(gsub(".$", "", rownames(df)))
myNames
#[1] "sigma" "alpha" "pi"
#split to 3 data.frames
for(i in myNames)
eval(parse(text=paste0("df_",i," <- df[ grepl('",i,"',rownames(df)),]")))
#check output
ls()
# [1] "df" "df_alpha" "df_pi" "df_sigma" "i" "myNames"
df_alpha
# Var1 Var2
# alpha1 12 5
# alpha2 21 9
# alpha3 18 9
编辑: 正如@NealFultz 建议的那样,为了提高代码的可读性,我们可以使用 assign:
for(i in myNames)
assign(paste0("df_",i),df[ grepl(i,rownames(df)),])