根据值列表(可能会有所不同)按比例填充列 例:
id <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
id <- as.data.frame(id)
names <- c("Jean", "Jules", "Lina")
names <- as.data.frame(names)
预期产出:
id names
1 Jean
2 Jean
3 Jean
4 Jules
5 Jules
6 Jules
7 Lina
8 Lina
9 Lina
10 Lina
我必须使用此示例中的任何列表调整我的第二列值:
id2 <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11)
id2 <- as.data.frame(id2)
names2 <- c("Jean", "Jules", "Lina", "Fred")
names2 <- as.data.frame(names2)
预期产出:
id2 names2
1 Jean
2 Jean
3 Jean
4 Jules
5 Jules
6 Jules
7 Lina
8 Lina
9 Lina
10 Fred
11 Fred
怎么做?
答案 0 :(得分:1)
首先,不要将你的矢量转换成数据框,真的没有必要这样做。
现在,以下函数返回与您的预期列匹配的向量,然后创建一个df。
fun <- function(x, y){
m <- length(x)
n <- length(y)
new <- rep(y, each = round(m/n))
if(m - n*round(m/n) > 0)
new <- c(new, rep(y[n], m - n*round(m/n)))
else
new <- new[seq_len(m)]
new
}
result1 <- data.frame(id, names1 = fun(id, names1))
result2 <- data.frame(id2, names2 = fun(id2, names2))
请注意,我已将向量names
的名称更改为names1
,因为names
已经是base R
函数。
答案 1 :(得分:1)
您可以通过将行数除以名称数来计算重复次数,然后使用tidyr::fill填充缺失值。
# Number of repetitions:
n <- nrow(id) %/% nrow(names)
# Repeat names
repnames <- rep(names$names, each = n)
# Make the names vector the same length as id
repnames <- repnames[1:nrow(id)]
# Change it to a data frame
repnames <- data.frame(names = repnames)
# Add id column
repnames$id <- id$id
# Fill the missing value
repnames <- tidyr::fill(repnames, names)
repnames
#
# names id
# 1 Jean 1
# 2 Jean 2
# 3 Jean 3
# 4 Jules 4
# 5 Jules 5
# 6 Jules 6
# 7 Lina 7
# 8 Lina 8
# 9 Lina 9
# 10 Lina 10