我在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。
答案 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