使用h2o.cbind将列添加到h2o数据集

时间:2018-03-21 18:37:35

标签: r h2o

我在H2O中有一个数据框(称为df1.hex),我正在尝试使用h2o.cbind向此数据框添加新列。我正在使用h2o 3.18.0.4。

我在下面显示的代码只是我想要做的简化版本。实际上,我正在根据各种条件向df1.hex数据框添加新列。底线是我希望能够在需要向df1.hex添加新列时使用'h2o.cbind'。所以,我必须在我的程序中多次调用h2o.cbind。我正在操作的真实数据集太大了,我无法在R中完成所有这些,然后将其导出到h2o。

请考虑以下代码:

# Let's load H2O and start up an H2O cluster
library(h2o)
h2o.init()

# Initialize a data frame with a column 'y'
df1 = data.frame(y=c('A', 'B', 'C'))
df1.hex = as.h2o(df1)
print(df1.hex)

# Need to append additional columns to df1.hex named x1, x2 etc...
for (i in 1:2) {
  df2 = data.frame(x=c(1*i, 2*i, 3*i))
  colnames(df2) = c(paste("x", i, sep='')) # x1, x2 etc...
  df2.hex = as.h2o(df2)
  print(paste("Iteration: ", i, ": Adding df2.hex...", sep=''))
  print(df2.hex)
  df1.hex = h2o.cbind(df1.hex, df2.hex) # Append x(i) to df1.hex data frame
}

print("The final dataset df1.hex: ")
print(df1.hex)

h2o.shutdown(prompt=FALSE)

输出如下:

> print(df1.hex)
      y
    1 A
    2 B
    3 C

[1] "Iteration: 1: Adding df2.hex..."
  x1
1  1
2  2
3  3

[1] "Iteration: 2: Adding df2.hex..."
  x2
1  2
2  4
3  6

[3 rows x 1 column] 

[1] "The final dataset df1.hex: "
> print(df1.hex)
  y x2 x20
1 A  2   2
2 B  4   4
3 C  6   6

即使我附加了两个名为x1和x2的新列,df1.hex的最终版本包含两列名为x2和x20的列。为什么会这样?

此外,x1列完全消失。我只看到列x2出现两次。

如何修复我的代码以命名我的列x1和x2,并在这些列中具有正确的值?

感谢。

KARTHIK。

2 个答案:

答案 0 :(得分:2)

可能是cbind仅绑定最后一个运行元素,基本上,导致两个' x2'列和使其唯一的列名称可能已更改为' x20'。一种方法是将其分配给list然后cbind

#initialize a `list` of length 2 
lst <- vector("list", 2)

for (i in 1:2) {
  #create the h2o dataset and assign it to each list element      
  lst[[i]] <- as.h2o(data.frame(x=c(1*i, 2*i, 3*i)))
  #change the column names of the h2o dataset
  names(lst[[i]]) <- paste0("x", i)        
}

#do the cbind outside the loop
do.call(h2o.cbind, c(df1.hex, lst))
#  y x1 x2
#1 A  1  2
#2 B  2  4
#3 C  3  6

#[3 rows x 3 columns] 

或者可以使用%>%函数

在管道(tidyverse)中完成此操作
library(tidyverse)
map(1:2, ~ tibble(x = (1:3) * .x) %>% 
                set_names(., paste0("x", .x)) %>% 
                as.h2o) %>%
         append(df1.hex, .) %>%
         do.call(h2o.cbind, .)
#   y x1 x2
#1 A  1  2
#2 B  2  4
#3 C  3  6

#[3 rows x 3 columns] 

答案 1 :(得分:1)

确定。我能够解决这个问题。

我刚刚在原帖中替换了以下代码:

  df1.hex = h2o.cbind(df1.hex, df2.hex) # Append x(i) to df1.hex data frame

有了......

  x.hex = h2o.cbind(df1.hex, df2.hex)
  df1.hex = h2o.assign(x.hex, 'df1')

我不确定,但它可能与h2o如何在内部存储数据有关。

完整代码如下所示:

# Let's load H2O and start up an H2O cluster
library(h2o)
h2o.init()

# Initialize a data frame with a column 'y'
df1 = data.frame(y=c('A', 'B', 'C'))
df1.hex = as.h2o(df1)
print(df1.hex)

# Need to append additional columns to df1.hex named x1, x2 etc...
for (i in 1:2) {
  df2 = data.frame(x=c(1*i, 2*i, 3*i))
  colnames(df2) = c(paste("x", i, sep='')) # x1, x2 etc...
  df2.hex = as.h2o(df2)
  print(paste("Iteration: ", i, ": Adding df2.hex...", sep=''))
  print(df2.hex)
  # df1.hex = h2o.cbind(df1.hex, df2.hex) # Append x(i) to df1.hex data frame
  x.hex = h2o.cbind(df1.hex, df2.hex)
  df1.hex = h2o.assign(x.hex, 'df1')
}

print("The final dataset df1.hex: ")
print(df1.hex)

h2o.shutdown(prompt=FALSE)

现在,我确实得到了所需的输出:

> print("The final dataset df1.hex: ")
[1] "The final dataset df1.hex: "
> print(df1.hex)
  y x1 x2
1 A  1  2
2 B  2  4
3 C  3  6

[3 rows x 3 columns] 
> 

干杯!

KARTHIK