无法从字符列创建频率列

时间:2017-12-03 12:57:48

标签: r group-by dplyr

我正在尝试向数据框添加一列,以提供字符列中唯一值的频率。这就是我到目前为止所做的:

              term  estimate std.error statistic      p.value
1      (Intercept) 6.0888310 1.3601938 4.4764437 8.318542e-06
2  factor(age76)25 0.6884056 0.8861507 0.7768494 4.374021e-01
3  factor(age76)26 0.2177806 0.9997128 0.2178431 8.275887e-01
4  factor(age76)27 0.5539639 0.9255542 0.5985213 5.496061e-01
5  factor(age76)28 0.8705031 0.5343690 1.6290300 1.035716e-01
6  factor(age76)29 1.2249185 0.7557118 1.6208804 1.053084e-01
7  factor(age76)30 0.6254308 0.8861507 0.7057838 4.804608e-01
8  factor(age76)31 1.2295179 0.5343690 2.3008782 2.157089e-02
9  factor(age76)32 0.3032523 0.8449115 0.3589161 7.197216e-01
10 factor(age76)33 1.1344686 0.7557118 1.5011921 1.335714e-01

sapply(df.b, class)
       term    estimate   std.error   statistic     p.value 
"character"   "numeric"   "numeric"   "numeric"   "numeric" 

library(dplyr)

df.b$n <- group_by(df.b$term) %>%
  summarise(df.b$term, freq = n())

Error in UseMethod("group_by_") : 
  no applicable method for 'group_by_' applied to an object of class "character"

我的专栏的字符类型似乎有问题。当我将其更改为数字时,我认为它将更改为NA。

dput(head(df.b))
structure(list(term = c("(Intercept)", "factor(age76)25", "factor(age76)26", 
"factor(age76)27", "factor(age76)28", "factor(age76)29"), estimate = c(6.08883100125014, 
0.688405615000334, 0.21778058000053, 0.553963930000528, 0.870503050000005, 
1.22491850000015), std.error = c(1.36019381570938, 0.886150663575717, 
0.999712776013908, 0.925554182033106, 0.534368956146369, 0.75571182509336
), statistic = c(4.47644367363531, 0.776849404166263, 0.217843149778352, 
0.598521340785982, 1.62902998010529, 1.6208804193964), p.value = c(8.31854214736379e-06, 
0.437402143453174, 0.827588701982869, 0.549606122411782, 0.103571567056818, 
0.105308432290008)), .Names = c("term", "estimate", "std.error", 
"statistic", "p.value"), row.names = c(NA, 6L), class = "data.frame")

我也尝试了这个,但它提供了一个警告代码:

df.b$n <- group_by(df.b, term)%>%
  summarise(freq = n())
head(df.b)
             term  estimate std.error statistic      p.value                                                    n
1     (Intercept) 6.0888310 1.3601938 4.4764437 8.318542e-06                                    # A tibble: 6 x 2
2 factor(age76)25 0.6884056 0.8861507 0.7768494 4.374021e-01                                           term  freq
3 factor(age76)26 0.2177806 0.9997128 0.2178431 8.275887e-01                                          <chr> <int>
4 factor(age76)27 0.5539639 0.9255542 0.5985213 5.496061e-01 1                                  (Intercept)     1
5 factor(age76)28 0.8705031 0.5343690 1.6290300 1.035716e-01 2                              factor(age76)25     1
6 factor(age76)29 1.2249185 0.7557118 1.6208804 1.053084e-01 3               factor(age76)25:factor(black)1     1
Warning message:
In format.data.frame(x, digits = digits, na.encode = FALSE) :
  Korrupter Data Frame: Spalten werden abgeschnitten oder mit NAs aufgefüllt

1 个答案:

答案 0 :(得分:4)

我认为您误解了group_by中关键功能(summarisedplyr)的使用。

首先,这些关键功能的输出是数据帧,而不是矢量。因此,您不应将输出分配给df.b$n,即数据框中的新列。

其次,如果要创建新列,请使用mutatesummarise它总结了群组统计信息,而不是创建新列。

第三,您可能想要查看管道操作的工作原理(http://seananderson.ca/2014/09/13/dplyr-intro.html)。这些关键函数的第一个参数是所有数据帧。您应该从df.b2 <- df.b %>% group_by(...)df.b2 <- group_by(df.b, ...)开始,其中...应为列名。在原始代码中,您使用group_by(df.b$term) %>% summarise(df.b$term, freq = n())并导致错误。这是有道理的,因为group_by应该将第一个参数作为数据框,但是你提供了一个字符向量。

最后一点,您可能无法显示整个数据框,但似乎term列中的元素都是唯一的,因此基于该列的频率计数可能都是1 。确保这是你想要的。

我修改了你的代码,如下所示。希望输出df.b2有意义。

library(dplyr)

df.b2 <- df.b %>%
  group_by(term) %>%
  mutate(freq = n()) %>%
  ungroup()
df.b2
# # A tibble: 6 x 6
#              term  estimate std.error statistic      p.value  freq
#             <chr>     <dbl>     <dbl>     <dbl>        <dbl> <int>
# 1     (Intercept) 6.0888310 1.3601938 4.4764437 8.318542e-06     1
# 2 factor(age76)25 0.6884056 0.8861507 0.7768494 4.374021e-01     1
# 3 factor(age76)26 0.2177806 0.9997128 0.2178431 8.275887e-01     1
# 4 factor(age76)27 0.5539639 0.9255542 0.5985213 5.496061e-01     1
# 5 factor(age76)28 0.8705031 0.5343690 1.6290300 1.035716e-01     1
# 6 factor(age76)29 1.2249185 0.7557118 1.6208804 1.053084e-01     1