作者andrew43 (讨厌有好心推文後删文者)
看板R_Language
标题Re: [问题] 指定group
时间Sun Aug 16 04:58:26 2015
写得很丑,但逻辑大概就是这样。
里面用了一些技巧,看懂之後欢迎学起来。
这都是内建的 funciton,应该直接用就可以了,但若是巨大资料就会很慢了。
dt <- data.frame(
series = c(1,2,3,4,5,6,1,1,2,2,2,2,2),
cate = c(2,3,4,2,2,5,1,2,2,3,4,4,4)
)
# 各 series 之下 cate 频率最高的值之对应(若无最高者,之後会出警告)。
# 这一句如果看不懂,请想像成一个回圈,每跑一次的对象是同一组series,
# 并找出频率最高的 cate 是谁。
tab <- tapply(
dt$cate,
dt$series,
function(x){
rownames(table(x)[order(table(x), decreasing = T)])[1]
}
)
# 这句只是建一个新的 dt。
dt.new <- data.frame(
series = dt$series,
cake = rep(NA, nrow(dt))
)
# 利用 dimnames(tab)[[1]] 和 tab[[i]] 来重建 dt.new,总共填 6 次。
# 看不懂的话把 i 用 1 或 2 去代入,再细看每个小部份。
for (i in 1:dim(tab)) {
ans <- rep(
as.numeric(tab[[i]]),
length(dt.new[dt.new$series == dimnames(tab)[[1]][i], ]$cake)
)
dt.new[dt.new$series == dimnames(tab)[[1]][i], ]$cake <- ans
}
※ 引述《lambking (BB)》之铭言:
: [问题类型]:
: 程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
: [软体熟悉度]:
: 入门(写过其他程式,只是对语法不熟悉)
: [问题叙述]:
: 想将资料中的某栏位指定为其最常见的group名称
: 例如
: series cate
: [1,] 1 2
: [2,] 2 3
: [3,] 3 4
: [4,] 4 2
: [5,] 5 2
: [6,] 6 5
: [7,] 1 1
: [8,] 1 2
: [9,] 2 2
: [10,] 2 3
: [11,] 2 4
: [12,] 2 4
: [13,] 2 4
: 在series中1出现三次,其cate分别为2,2,1 频率最高的为2
: 想将所有series为1的族群 其cate栏位接指定为4
: 又例如 series中为2的族群 其cate 分别为 3,2,3,4,4,4 频率最高的4
: 想将所有series为2的族群 其cate栏位皆指定为4
: 请问除了用for loop外有其他方法吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.117.37.172
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1439672309.A.25A.html
※ 编辑: andrew43 (122.117.37.172), 08/16/2015 05:00:19
※ 编辑: andrew43 (122.117.37.172), 08/16/2015 05:00:44
1F:推 lambking: 谢谢! 但因为资料量很大, 会在想想看其他方法 08/16 06:00
3F:→ celestialgod: 谢谢a大推荐我的文章~~ 08/16 09:02
4F:→ lambking: 谢谢! 08/16 18:19