我的数据集由变量组成:日期、时间、种类、饮食。
“饮食”只记录在每一天的某些‘时间’,因此,我想要创建一个新的变量' daily.diet‘,其值是每个物种每天的“饮食”值(即,当天和物种匹配时,daily.diet=饮食)。
我制作了一个使用dataframe的示例:
df <- data.frame(day = c(1,1,1,2,2,2,3,3,3),
time = c(5,6,7,9,5,7,9,5,9),
species = c('a','b','c','c','c','b','a','a','b'),
diet=c('na', 'na', 'green', 'na', 'na', 'blue', 'na', 'na', 'na'))发布于 2020-09-18 03:07:43
同意@Michael的观点,您可能会考虑使用NA来查找丢失的数据,除非您的编码方案/数据收集有充分的理由引导您。
也可以使用tidyverse,您可以从tidyr中输入diet值,在缺少的地方,在day和species相同的行中填写。
例如:
library(dplyr)
library(tidyr)
df$diet <- replace(df$diet, df$diet == 'na', NA)
df %>%
group_by(day, species) %>%
fill(diet, .direction = "downup")示例数据不包括可能发生这种情况的实例。下面是一个要演示的不同数据的示例,并创建了一个新列daily.diet
df %>%
group_by(day, species) %>%
mutate(daily.diet = diet) %>%
fill(daily.diet, .direction = "downup")输出
day time species diet daily.diet
<dbl> <dbl> <chr> <chr> <chr>
1 1 5 a NA NA
2 1 6 b NA NA
3 1 7 c green green
4 1 9 c NA green
5 2 5 c NA NA
6 2 7 b blue blue
7 3 9 a red red
8 3 5 a NA red
9 3 9 b NA NA 数据
df <- structure(list(day = c(1, 1, 1, 1, 2, 2, 3, 3, 3), time = c(5,
6, 7, 9, 5, 7, 9, 5, 9), species = c("a", "b", "c", "c", "c",
"b", "a", "a", "b"), diet = c(NA, NA, "green", NA, NA, "blue",
"red", NA, NA)), row.names = c(NA, -9L), class = "data.frame")发布于 2020-09-17 20:49:07
虽然我不太确定你在找什么,但我猜你想要的是
library(tidyverse)
new_df <- df %>%
group_by(species, day) %>%
filter(n_distinct(diet) == 1) %>%
ungroup %>%
distinct(day, species, daily.diet = diet)您可以使用df %>% left_join(new_df)将其连接回原始数据。
另外,您可能希望使用NA而不是'na'。后者只是一个字符串,而前者是R缺少的特殊值。
https://stackoverflow.com/questions/63945510
复制相似问题