dee*_*mel 1 r vector dataframe
所以我有一个示例数据框,其中包含id,count和username,其中id和count是数字,username是字符串.
对于数据帧的每一行,我想设置一个名为'ratio'的新列的值,其中ratio被定义为
count /行数,其中username ==此行中的用户名
提供数据的示例:
在用户名为"Tom"的每一行中,比率将为count/4,因为用户Tom在数据中被找到四次.
这只是我的问题的简化版本,for循环不是一个选项,因为我的原始数据帧有大约340万行和我以前的方法,我用for循环来迭代例如'username'的唯一值来解决这个问题问题需要永远.
我的数据帧的输入:
structure(list(id = 1:20, count = c(140L, 89L, 17L, 114L, 129L,
86L, 21L, 50L, 197L, 160L, 8L, 14L, 78L, 208L, 155L, 55L, 63L,
20L, 189L, 79L), usernames = structure(c(4L, 3L, 5L, 5L, 2L,
3L, 1L, 1L, 3L, 1L, 3L, 2L, 5L, 5L, 4L, 4L, 2L, 2L, 2L, 3L), .Label = c("Jerry",
"Mark", "Phil", "Tina", "Tom"), class = "factor")), .Names = c("id",
"count", "usernames"), row.names = c(NA, 20L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)
我希望我提供了一切让你理解和重现的问题,如果遗漏的东西在评论中毫不犹豫地提及它.
有几种选择.这里有三个,一个在基础R,一个在data.table,和一个"plyr".两者都假设我们从一个名为"mydf"的data.frame开始:
within(mydf, {
temp <- as.numeric(ave(as.character(usernames), usernames, FUN = length))
ratio <- count/temp
rm(temp)
})
Run Code Online (Sandbox Code Playgroud)
library(data.table)
DT <- data.table(mydf)
DT[, ratio := count/.N, by = "usernames"]
DT
Run Code Online (Sandbox Code Playgroud)
library(plyr)
ddply(mydf, .(usernames), transform,
ratio = count/length(usernames))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1100 次 |
| 最近记录: |