[,]和$之间的逻辑陈述的差异

Jan*_*sch 3 logic r vector dataframe

我正在处理一个数据框('df_temp'),其中有两列客户ID('Custid')和收入('收入'):

  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
Run Code Online (Sandbox Code Playgroud)

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

使用$来引用收入,返回TRUE:

> is.numeric(df_temp$Income)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

使用[,2]或[,(...())来引用收入,返回FALSE:

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

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

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

我一直认为$和[]在引用数据框中的向量时起到同样的作用.

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

Jos*_*ich 10

您没有使用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 
Run Code Online (Sandbox Code Playgroud)

因此,您不能[以您想要的方式使用tbl_df.您必须使用$[[提取矢量.

is.numeric(x$cyl)
# [1] TRUE
is.numeric(x[["cyl"]])
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

  • @RichScriven:假设我在写作时看了其他答案.当我开始时,没有答案.我也没有使用提交简短,不完整的答案以便"先"的"策略",然后在5分钟的初始编辑窗口用完之前将其编辑为完整性. (6认同)