在某些条件下提取数据框行

时间:2015-07-08 03:41:10

标签: r dataframe subset

我有一个数据框,两个V1V2变量,有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的所有观察。并使它们成为一个新的数据框架。

3 个答案:

答案 0 :(得分:2)

我会从第一个字母创建一个分组变量,并将其与split:

一起使用
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

答案 1 :(得分:2)

我们可以使用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)),])

答案 2 :(得分:0)

如果您转换为public static Singleton Instance() ,则可以执行以下操作:(我正在调用您的第一列的名称data.table

letter

然后你可以和其他人一样做。