这个“带有char数组的char数组的索引”如何工作?

时间:2016-03-16 12:46:30

标签: r

我正在使用R的条形图阅读this article on fixing pie chart from WSJ。原文中有完整的代码,所以我在此不再赘述。我对这条线感到困惑:

dat$amount <- factor(amount_trans[dat$amount], levels=amount_trans)

特别是amount_trans[dat$amount]。我理解总体目标是用“\ n”替换原始标签以获得更好的格式,并使用级别来修复订单。但我不确定这是怎么做到的。 dat$amount是一个char数组,amount_trans也是一个char数组。带有char数组的char数组的索引?

> dat$amount[1:2]
[1] "less_than_one_hour_per_week" "less_than_one_hour_per_week"



amount_trans <- c("less_than_one_hour_per_week"="<1 hr/\nwk", 
                  "one_to_four_hours_per_week"="1-4 hrs/\nwk", 
                  "one_to_three_hours_a_day"="1-3 hrs/\nday", 
                  "four_or_more_hours_a_day"="4+ hrs/\nday")

以上行确实按预期工作,这会按预期更改标签。

然而,下次使用它(类似的想法,我仍然不知道为什么)只是不起作用:

dat$Task <-factor(title_trans[dat$Task], levels=title_trans)

它出于某种原因返回一些NA,这是我尝试过的:

> title_trans <- c("Basic exploratory data analysis"="Basic exploratory\ndata analysis", 
+                  "Data cleaning"="Data\ncleaning", 
+                  "Machine learning, statistics"="Machine learning,\nstatistics", 
+                  "Creating visualizations"="Creating\nvisualizations", 
+                  "Presenting analysis"="Presenting\nanalysis", 
+                  "Extract, transform, load"="Extract,\ntransform, load")
> head(dat$Task)
[1] "                  Basic exploratory data analysis" "                  Data cleaning"                   "                  Machine learning, statistics"   
[4] "                  Creating visualizations"         "                  Presenting analysis"             "                  Extract, transform, load"       
> dat$Task <-factor(title_trans[dat$Task], levels=title_trans)
> head(dat$Task)
[1] <NA> <NA> <NA> <NA> <NA> <NA>
Levels: Basic exploratory\ndata analysis Data\ncleaning Machine learning,\nstatistics Creating\nvisualizations Presenting\nanalysis Extract,\ntransform, load

N/A值令人费解。这也使最终的情节与截图中显示的不完全相同。

更新:现在我意识到数据中的额外空白区域会导致匹配给出NA s。困惑解决了。

1 个答案:

答案 0 :(得分:1)

  

带char数组的char数组的索引?

不,使用名称向量索引命名字符向量数组):

values = c(a = 1, b = 2, c = 3)
values['a'] # 1
values[c('b', 'c')] # 2, 3

这就是那里发生的一切。我不知道为什么代码的原作者将矢量名称放在引号中但是没有必要,而且实际上很奇怪:

amount_trans <- c(less_than_one_hour_per_week = "<1 hr/\nwk", 
                  one_to_four_hours_per_week = "1-4 hrs/\nwk", 
                  one_to_three_hours_a_day = "1-3 hrs/\nday", 
                  four_or_more_hours_a_day = "4+ hrs/\nday")