使用循环时tbl_df和data.frame的区别

peter_w

我一直在遍历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"

这不仅仅是打印上的差异,这似乎是三个两个元素的向量,而不是六个一个元素的向量,并且我的后续代码仅在正常数据帧上运行循环时才按预期工作。

谁能解释为什么我看到这些差异?

卡沙阿

你不能做for looptbl_df与子集化[文档说明了一切:

[从不简化(删除),因此始终返回data.frame

你看到hospitals2[hospitals2$hospital==hosp, "ward"]回报data.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"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

as.tibble(),as_data_frame()和tbl_df()有什么区别?

为data.frame和tbl_df设置行和列

dplyr显示tbl_df中小data.frame的所有行和列

如何转换从Excel中从““ tbl_df”“ tbl”“ data.frame”导入的数据集。到“ xts”?

无法将`spec_tbl_df / tbl_df / tbl / data.frame`对象转换为函数

奇怪:sapply无法在dplyr :: tbl_df()本地data.frame上工作

在R中使用ifelse()将变量分配给tbl_df / data.frame对象会导致R的内存不足

Frame 和 Canvas tkinter 之间的区别?

frame.size.width和frame.width之间的区别

继承(x,"data.frame") 和 "class" %in% class("data.frame") 之间的区别

`assert_frame_equal`和`equals`有什么区别

UIView的frame.height和frame.size.height有什么区别?

R中的data和data.frame有什么区别?

在 R 中将 tbl_df 结果转换和导出到 xlsx 时出错

RF 中的 Select Frame 和 Switch Window 有什么区别?

在gdb中,“ where”,“ bt”和“ i frame”命令之间有什么区别?

'tableView.contentSize'和'tableView.frame.size'有什么区别

X-Frame-Options和Content-Security-Policy标头之间的安全性区别?

Java中的showMessageDialog中的frame和null有什么区别?

WebDriver.SwitchTo().Window() 和 WebDriver.SwitchTo().Frame() 有什么区别

RF 中的 Select Frame 和 Switch Window 有什么区别?

在tbl_df列表上进行映射和变异

使用变量名称过滤dplyr的tbl_df

RStudio中未使用的参数.tbl_df中的错误

ifconfig RX数据包输出中的“ errors:”,“ dropped:”,“ overruns:”和“ frame:”字段之间有什么区别?

如何使用dplyr将tbl_mysql类的对象转换为tbl_df?

df[df['col a']] 和 df['col a'] 的区别?

将tbl_df转换为ts

打印时在dplyr tbl_df中四舍五入数值