【问题标题】:Difference in Logical Statement between [,] and $[,] 和 $ 之间逻辑语句的区别
【发布时间】:2017-03-17 14:47:11
【问题描述】:

我正在处理包含两列客户 ID ('Custid') 和收入 ('Income') 的数据框 ('df_temp'):

  Custid    Income
  <fctr>     <dbl>
1   1003  29761.20
2   1004  98249.55
3   1006  23505.30
4   1007  72959.25
5   1009 114973.95
6   1010  25038.30

在检查收入是否为数字时,我遇到了以下问题:

使用 $ 表示收入,返回 TRUE:

> is.numeric(df_temp$Income)
[1] TRUE

使用 [,2] 或 [,which(...)] 表示收入,返回 FALSE:

> i <- which(names(df_temp)=='Income')
> is.numeric(df_temp[,i])
[1] FALSE
> is.numeric(df_temp[,2])
[1] FALSE

当尝试使用 [,] 将此向量设置为数值时,我遇到了另一个问题:

> df_temp[,2] <- as.numeric(df_temp[,2])
Error: (list) object cannot be coerced to type 'double'

我一直认为 $ 和 [] 在引用数据框中的向量时具有相同的目的。

有人可以帮助我理解问题并使用 [,] 表达式将此向量转换为数字吗?

【问题讨论】:

  • 你有一个tb_df 对象
  • str(df_temp[,2])的结果是什么?
  • @jogo,它是:类“tbl_df”、“tbl”和“data.frame”:2431 obs。 1 个变量:$ 收入:num 29761 98250 23505 72959 114974 ...
  • 从您的输出中,您没有使用 data.frame 对象。最有可能的是,hadley 对如何引用此类对象进行了一些更改。您应该列出您在问题中使用的所有相关软件包的名称。
  • @JanBenedikt 所以你看:它不是一个数字向量。 df_temp 不是数据框对象[ 对象上的操作方式与数据帧不同。查看 akrun 或 Joshua 的答案!

标签: r vector dataframe logic


【解决方案1】:

您没有使用 data.frame。您正在使用“tbl_df”。使用$ 对 tbl_df 进行子集化会返回一个向量。使用[ 对 tbl_df 进行子集化会返回 tbl_df,而 tbl_df 不是数字向量,因此 is.numeric 会返回 FALSE

tbl_df 所做的一件事是在调用[ 时使用drop = FALSE。但是通过主动阻止您设置drop = TRUE,它更进一步:

x <- tbl_df(mtcars)
is.numeric(x[,"cyl",drop=TRUE])
# [1] FALSE
Warning messages:
1: drop ignored 

因此,您不能以您想要的方式将[ 与 tbl_df 一起使用。您必须使用$[[ 来提取向量。

is.numeric(x$cyl)
# [1] TRUE
is.numeric(x[["cyl"]])
# [1] TRUE

【讨论】:

  • @RichScriven:假设我在写我的时候看过其他答案。当我开始时,没有答案。我也不会使用提交简短、不完整答案的“策略”来成为“第一”,然后在 5 分钟的初始编辑窗口用完之前将其编辑至完整性。
【解决方案2】:

要完整回答这个问题,$ 和 [ 在标准 data.frame 对象上的用途相同:

Custid <- c(1003, 1004, 1006, 1007, 1009, 1010)
Income <- c(29761.20, 98249.55, 23505.30, 72959.25, 114973.95, 25038.30)
mydf <- data.frame(Custid, Income)
class(mydf$Income); class(mydf[ , 2])

您正在处理一个tbl_df 对象:

library(dplyr)
mytbl_df <- tbl_df(mydf)
print(mytbl_df)
## A tibble: 6 × 2
#  Custid    Income
#   <dbl>     <dbl>
#1   1003  29761.20
#2   1004  98249.55
#3   1006  23505.30
#4   1007  72959.25
#5   1009 114973.95
#6   1010  25038.30

要让 [ 在 mytbl_df 上正常工作,只需将其转换回 data.frame:newdf &lt;- as.data.frame(mytbl_df)

【讨论】:

    【解决方案3】:

    我们有一个tbl_df 对象,所以使用[ 提取仍然是tbl_df,即

    df_temp[,i]
    # A tibble: 6 × 1
    #     Income
    #      <dbl>
    #1  29761.20
    #2  98249.55
    #3  23505.30
    #4  72959.25
    #5 114973.95
    #6  25038.30
    

    我们可以提取[[

    df_temp[[i]]
    #[1]  29761.20  98249.55  23505.30  72959.25 114973.95  25038.30
    
    
    is.numeric(df_temp[[i]])
    #[1] TRUE
    

    数据

    df_temp <- structure(list(Custid = c(1003L, 1004L, 1006L, 1007L, 1009L, 
    1010L), Income = c(29761.2, 98249.55, 23505.3, 72959.25, 114973.95, 
    25038.3)), .Names = c("Custid", "Income"), row.names = c("1", 
    "2", "3", "4", "5", "6"), class = c("tbl_df", "tbl", "data.frame"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 2019-06-08
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多