我有两个tibble,需要索引一个tibble中的数据,并根据第一个tibble中的变量在另一个tibble中插入一些特定的数据。
我有两条建议:
library(dplyr)
# Set seed
set.seed(10)
# Get data
df1 <- starwars %>%
select(name,species) %>%
filter(species %in% c("Human","Wookiee","Droid")) %>%
mutate(Fav_colour = sample(c("blue","red","green"),n(),replace=TRUE))
# Random table with typical colour preference
df2 <- tibble(Colour = c("blue","green","red"),
Human = c(0.5,0.3,0.1),
Wookiee = c(0.2,0.8,0.5),
Droid = c(0.3,0.1,0.5))
在df1中,我需要插入基于物种的典型颜色偏好,为此,我可以在for循环中遍历tibble的每一行,添加相关数据,然后编译成一个列表。
# Make empty list
data <- list()
# Iterate through each row
for (x in 1:nrow(df1)) {
# Take a slice
tmp <- slice(df1, x)
# Add new column to slice based on data in slice (species)
tmp$Typical <- df2 %>%
select(Colour,tmp$species) %>%
arrange(desc(.data[[tmp$species]])) %>%
slice_head(n = 1) %>%
select(Colour) %>%
as.character()
#Add data to list
data[[x]] <- tmp
}
#Recompile df1
df1 <- list.rbind(data)
我认为一定有更有效的方法来实现这一点,但是我不知道如何在不使用for循环的情况下从df2中获得经过过滤和排列的值。我不知道如何做到这一点,但是使用带函数的sapply可能是更好的选择吗?不使用for循环的dplyr方法是什么?
2条答案
按热度按时间lf5gs5x21#
听起来你想从
df2
中得到每个物种的最大值。如果我们pivot_longer
使物种在一列中指定,而值在另一列中指定,我们可以按物种分组并保留最大值。这个查找表(颜色+每个物种的值)可以加入到原始数据中。结果
erhoui1w2#
请检查不使用循环的替代方法,检查df4 Dataframe