假设我有一个像这样的数据框:
df <- data.frame(First_Name=c("John","Alex","James","John","Alex","John","James"),
Last_Name = c("Smith","Smith","Jones","Jones","Johnson","Ryan","Murphy"),
Frequency = c(4,7,8,9,3,10,4))
First_Name Last_Name Frequency
1 John Smith 4
2 Alex Smith 7
3 James Jones 5
4 John Jones 9
5 Alex Johnson 3
6 John Ryan 10
7 James Murphy 4
并且我想只将第一列(名字)折叠成唯一值,然后根据其累积频率对名称进行排序。对于此示例,如果我们执行此操作并以降序排序,则其顺序为:John,James,Alex,因为它们各自的累积频率分别为23、10和12。
来自python背景,我当时想将值存储在一个元组中,但是我不确定R是否有一个等效项(目前,我只对向量很熟悉)。
另外,如果我尝试仅从“ First_Name”列中提取唯一值并将其存储在向量中:
unique(c(df$First_Name))
R输出以下内容:
[1] 3 1 2
这似乎表明他们将名称转换为整数。
所以我的问题是:
1)我将如何只获取唯一的名字并根据它们的累积值对它们进行排序?
2)如果我尝试将名称存储在向量中,为什么R会将名称转换为整数?
R默认情况下将字符更改为因数,这可能很烦人。您可以通过以下命令进行检查:
str(df)
这表现了
'data.frame': 7 obs. of 3 variables:
$ First_Name: Factor w/ 3 levels "Alex","James",..: 3 1 2 3 1 3 2
$ Last_Name : Factor w/ 5 levels "Johnson","Jones",..: 5 5 2 2 1 4 3
$ Frequency : num 4 7 8 9 3 10 4
如果添加stringsAsFactors标志,将避免这种情况:
df <- data.frame(First_Name=c("John","Alex","James","John","Alex","John","James"),
Last_Name = c("Smith","Smith","Jones","Jones","Johnson","Ryan","Murphy"),
Frequency = c(4,7,8,9,3,10,4), stringsAsFactors = FALSE)
str(df)
'data.frame': 7 obs. of 3 variables:
$ First_Name: chr "John" "Alex" "James" "John" ...
$ Last_Name : chr "Smith" "Smith" "Jones" "Jones" ...
$ Frequency : num 4 7 8 9 3 10 4
但是,无论哪种方式,您都可以按唯一性分组,并使用聚合使用该子集的任何功能:
aggregate(Frequency ~ First_Name, data=df, FUN="sum")
First_Name Frequency
1 Alex 10
2 James 12
3 John 23
可以使用订单功能对表格进行重新排序
out <- out[rev(order(out$Frequency)),]
First_Name Frequency
3 John 23
2 James 12
1 Alex 10
如果要按累积摘要对第一个表重新排序,并保持其原样,则需要合并。
out$rank <- 1:nrow(out)
new <- merge(df, out, by.x='First_Name', by.y='First_Name')
final <- new[order(new$rank),]
First_Name Last_Name Frequency.x Frequency.y rank
1 Alex Smith 7 10 1
2 Alex Johnson 3 10 1
3 James Jones 8 12 2
4 James Murphy 4 12 2
5 John Smith 4 23 3
6 John Jones 9 23 3
7 John Ryan 10 23 3
然后删除不需要的列。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句