我正在尝试向数据框添加一列,以提供字符列中唯一值的频率。这就是我到目前为止所做的:
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
答案 0 :(得分:4)
我认为您误解了group_by
中关键功能(summarise
和dplyr
)的使用。
首先,这些关键功能的输出是数据帧,而不是矢量。因此,您不应将输出分配给df.b$n
,即数据框中的新列。
其次,如果要创建新列,请使用mutate
。 summarise
它总结了群组统计信息,而不是创建新列。
第三,您可能想要查看管道操作的工作原理(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