通过变量组合创建数据框

时间:2020-09-10 06:51:08

标签: r dataframe

我试图在R中创建一个数据框。我有2种方法和2种类型。我的收获是一个具有5个值的向量。例如对于a_gain_train类型的规则A的train_gain,我有5个值。

error_table = data.frame(
  Method = c("Rule A", "Rule A", "Rule B", "Rule B"),
  type = c("train_gain", "test_gain", "train_gain", "test_gain"),
  gain = c(a_gain_train, a_gain_test, b_gain_train, b_gain_test)
)

我需要创建一个像这样的数据框

Methode   type            gain
Rule A    train_gain      1
Rule A    train_gain      1.2
Rule A    train_gain      1.5
Rule A    train_gain      1.7
Rule A    train_gain      2
Rule A    test_gain       1.4
Rule A    test_gain       1.6
Rule A    test_gain       1.8
Rule A    test_gain       1.4
Rule A    test_gain       2.4
Rule B    train_gain      1
Rule B    train_gain      1.2
Rule B    train_gain      1.5
Rule B    train_gain      1.7
Rule B    train_gain      2
Rule B    test_gain       1.4
Rule B    test_gain       1.6
Rule B    test_gain       1.8
Rule B    test_gain       1.4
Rule B    test_gain       2.4

4 个答案:

答案 0 :(得分:0)

我们可以使用crossing

library(tidyr)
library(dplyr)
crossing(Methode = c('Rule A', 'Rule B'), type = c('train_gain', 'test_gain')) %>% 
    mutate(gain = rep(list(gain_train, gain_test), 2)) %>% 
   unnest(c(gain))

或者使用expand.grid中的base R

transform(expand.grid(Methode = c('Rule A', 'Rule B'), 
  gain =  c(gain_train, gain_test)),
      type = rep(c('train_gain', 'test_gain'), each = 5))

其中

gain_train <- c(1, 1.2, 1.5, 1.7, 2)
gain_test <- c(1.4, 1.6, 1.8, 1.4, 2.4)

答案 1 :(得分:0)

您可以使用rep重复这些值,并使用each指定要重复多少次。

error_table <- data.frame(
        Method = rep(c("Rule A", "Rule B"), each = 10),
     type = rep(c("train_gain","test_gain","train_gain","test_gain"), each = 5),
      gain=c(a_gain_train,a_gain_test,b_gain_train,b_gain_test))

答案 2 :(得分:0)

既然您已经将这4个列表另存为单独的变量,请使用简单的rbind

rbind(data.frame(Method="RULE A", type="train_gain",gain=a_gain_train),
      data.frame(Method="RULE A", type="test_gain",gain=a_gain_test),
      data.frame(Method="RULE B", type="train_gain",gain=b_gain_train),
      data.frame(Method="RULE B", type="test_gain",gain=b_gain_test))

输出

  Method       type  gain
1  RULE A train_gain    1
2  RULE A train_gain    2
3  RULE A train_gain    3
4  RULE A train_gain    4
5  RULE A train_gain    5
6  RULE A  test_gain    2
7  RULE A  test_gain    3
8  RULE A  test_gain    4
9  RULE A  test_gain    5
10 RULE A  test_gain    6
11 RULE B train_gain   10
12 RULE B train_gain   11
13 RULE B train_gain   12
14 RULE B train_gain   13
15 RULE B train_gain   14
16 RULE B  test_gain   19
17 RULE B  test_gain   20
18 RULE B  test_gain   21
19 RULE B  test_gain   22
20 RULE B  test_gain   23

注意:gain列中的值只是用于说明的假设数字

答案 3 :(得分:0)

给出四个增益向量。然后,您可以尝试构造一个嵌套列表并将其取消嵌套两次。

              return Container(
                height: MediaQuery.of(context).size.height,
                child: Stack(
                fit: StackFit.expand,
                children: <Widget>[

数据

library(tidyr)

list("Rule A" = list("train_gain" = a_gain_train, "test_gain" = a_gain_test),
     "Rule B" = list("train_gain" = b_gain_train, "test_gain" = b_gain_test)) %>%
  tibble::enframe() %>%
  unnest_longer(value, values_to = "gain", indices_to = "type") %>%
  unnest(gain)

# # A tibble: 20 x 3
#    name    gain type      
#    <chr>  <dbl> <chr>     
#  1 Rule A   1   train_gain
#  2 Rule A   1.2 train_gain
#  3 Rule A   1.5 train_gain
#  4 Rule A   1.7 train_gain
#  5 Rule A   2   train_gain
#  6 Rule A   1.4 test_gain 
#  7 Rule A   1.6 test_gain 
#  8 Rule A   1.8 test_gain 
#  9 Rule A   1.4 test_gain 
# 10 Rule A   2.4 test_gain 
# 11 Rule B   1   train_gain
# 12 Rule B   1.2 train_gain
# 13 Rule B   1.5 train_gain
# 14 Rule B   1.7 train_gain
# 15 Rule B   2   train_gain
# 16 Rule B   1.4 test_gain 
# 17 Rule B   1.6 test_gain 
# 18 Rule B   1.8 test_gain 
# 19 Rule B   1.4 test_gain 
# 20 Rule B   2.4 test_gain