Re: [问题] 指定group

楼主: andrew43 (讨厌有好心推文后删文者)   2015-08-16 04:58:26
写得很丑,但逻辑大概就是这样。
里面用了一些技巧,看懂之后欢迎学起来。
这都是内建的 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外有其他方法吗?
作者: lambking (BB)   2015-08-16 06:00:00
谢谢! 但因为资料量很大, 会在想想看其他方法
楼主: andrew43 (讨厌有好心推文后删文者)   2015-08-16 06:57:00
巨大资料的话先看看 #1LhW7Tvj (R_Language)
作者: celestialgod (天)   2015-08-16 09:02:00
谢谢a大推荐我的文章~~
作者: lambking (BB)   2015-08-16 18:19:00
谢谢!

Links booklink

Contact Us: admin [ a t ] ucptt.com