tbl_df 和 data.frame 使用循环时的区别
tbl_df and data.frame difference when using loops
我一直在循环遍历 dplyr tbl_df 中的值,试图打印两列的唯一组合。经过多次试验和错误后,我只能通过将 tbl_df 转换回标准 data.frame 来准确获得所需的输出。我知道这两种结构之间的主要区别,但我仍然无法理解每种结构的不同输出。
例如使用这个数据
hospital <- rep(c("Hospital 1", "Hospital 2", "Hospital 3"), 3)
ward <- LETTERS[1:2]
hospitals <- data.frame(cbind(hospital, ward))
hospitals[order(hospitals$hospital, hospitals$ward), ]
# hospital ward
# 1 Hospital 1 A
# 7 Hospital 1 A
# 4 Hospital 1 B
# 5 Hospital 2 A
# 2 Hospital 2 B
# 8 Hospital 2 B
# 3 Hospital 3 A
# 9 Hospital 3 A
# 6 Hospital 3 B
和下面的循环
for(hosp in unique(hospitals$hospital)){
for(wa in unique(hospitals[hospitals$hospital==hosp, "ward"])){
print(paste(hosp, wa, sep=" "))
}
}
我可以得到我想要的输出
#[1] "Hospital 1 A"
#[1] "Hospital 1 B"
#[1] "Hospital 2 B"
#[1] "Hospital 2 A"
#[1] "Hospital 3 A"
#[1] "Hospital 3 B"
但是使用相同数据的 tbl_df 我得到不同的输出
hospitals2 <- tbl_df(hospitals)
for(hosp in unique(hospitals2$hospital)){
for(wa in unique(hospitals2[hospitals2$hospital==hosp, "ward"])){
print(paste(hosp, wa, sep=" "))
}
}
#[1] "Hospital 1 A" "Hospital 1 B"
#[1] "Hospital 2 B" "Hospital 2 A"
#[1] "Hospital 3 A" "Hospital 3 B"
这不仅仅是打印上的差异,这似乎是三个二元素向量而不是六个单元素向量,而且我的后续代码仅在 运行 正常数据帧上的循环时才按预期工作.
谁能解释为什么我会看到这些差异?
您不能在 tbl_df
上使用子集 [
执行 for loop
。文档说明了一切:
[
Never simplifies (drops), so always returns data.frame
.
你看hospitals2[hospitals2$hospital==hosp, "ward"]
returnsdata.frame
hospitals2[hospitals2$hospital==hosp, "ward"]
#Source: local data frame [3 x 1]
# ward
#1 A
#2 B
#3 A
而
hospitals[hospitals$hospital==hosp, "ward"]
#[1] A B A
#Levels: A B
使用[[
提取列向量,例如
for(hosp in unique(hospitals2$hospital)){
for(wa in unique(hospitals[hospitals$hospital==hosp,][["ward"]])){
print(paste(hosp, wa, sep=" "))
}
}
#[1] "Hospital 1 A"
#[1] "Hospital 1 B"
#[1] "Hospital 2 B"
#[1] "Hospital 2 A"
#[1] "Hospital 3 A"
#[1] "Hospital 3 B"
我一直在循环遍历 dplyr tbl_df 中的值,试图打印两列的唯一组合。经过多次试验和错误后,我只能通过将 tbl_df 转换回标准 data.frame 来准确获得所需的输出。我知道这两种结构之间的主要区别,但我仍然无法理解每种结构的不同输出。
例如使用这个数据
hospital <- rep(c("Hospital 1", "Hospital 2", "Hospital 3"), 3)
ward <- LETTERS[1:2]
hospitals <- data.frame(cbind(hospital, ward))
hospitals[order(hospitals$hospital, hospitals$ward), ]
# hospital ward
# 1 Hospital 1 A
# 7 Hospital 1 A
# 4 Hospital 1 B
# 5 Hospital 2 A
# 2 Hospital 2 B
# 8 Hospital 2 B
# 3 Hospital 3 A
# 9 Hospital 3 A
# 6 Hospital 3 B
和下面的循环
for(hosp in unique(hospitals$hospital)){
for(wa in unique(hospitals[hospitals$hospital==hosp, "ward"])){
print(paste(hosp, wa, sep=" "))
}
}
我可以得到我想要的输出
#[1] "Hospital 1 A"
#[1] "Hospital 1 B"
#[1] "Hospital 2 B"
#[1] "Hospital 2 A"
#[1] "Hospital 3 A"
#[1] "Hospital 3 B"
但是使用相同数据的 tbl_df 我得到不同的输出
hospitals2 <- tbl_df(hospitals)
for(hosp in unique(hospitals2$hospital)){
for(wa in unique(hospitals2[hospitals2$hospital==hosp, "ward"])){
print(paste(hosp, wa, sep=" "))
}
}
#[1] "Hospital 1 A" "Hospital 1 B"
#[1] "Hospital 2 B" "Hospital 2 A"
#[1] "Hospital 3 A" "Hospital 3 B"
这不仅仅是打印上的差异,这似乎是三个二元素向量而不是六个单元素向量,而且我的后续代码仅在 运行 正常数据帧上的循环时才按预期工作.
谁能解释为什么我会看到这些差异?
您不能在 tbl_df
上使用子集 [
执行 for loop
。文档说明了一切:
[
Never simplifies (drops), so always returnsdata.frame
.
你看hospitals2[hospitals2$hospital==hosp, "ward"]
returnsdata.frame
hospitals2[hospitals2$hospital==hosp, "ward"]
#Source: local data frame [3 x 1]
# ward
#1 A
#2 B
#3 A
而
hospitals[hospitals$hospital==hosp, "ward"]
#[1] A B A
#Levels: A B
使用[[
提取列向量,例如
for(hosp in unique(hospitals2$hospital)){
for(wa in unique(hospitals[hospitals$hospital==hosp,][["ward"]])){
print(paste(hosp, wa, sep=" "))
}
}
#[1] "Hospital 1 A"
#[1] "Hospital 1 B"
#[1] "Hospital 2 B"
#[1] "Hospital 2 A"
#[1] "Hospital 3 A"
#[1] "Hospital 3 B"