基于另一DataFrame的日期与艺术家条件筛选DataFrame
解决方案
我来帮你搞定这个需求!首先我们需要处理日期格式(字符串没法直接比较先后),再按照你的条件筛选出符合要求的行。以下是完整的步骤和代码:
1. 构造示例数据
先把你给出的两个DataFrame用R代码还原出来,方便复现:
# 创建C1 DataFrame C1 <- data.frame( Date = c("01-11-1955", "18-01-1956", "19-04-1956", "01-05-1956", "21-11-1956"), Artist = c("M", "M", "M", "M", "X"), stringsAsFactors = FALSE ) # 创建T1 DataFrame T1 <- data.frame( Date = c("06-11-1955", "15-01-1956", "15-04-1956", "06-05-1956", "25-11-1956", "25-11-1956"), Artist = c("UNK", "M", "UNK", "UNK", "X", "M"), FeatArtist = c("M", "UNK", "M", "M", "UNK", "UNK"), stringsAsFactors = FALSE )
2. 转换日期格式
把字符串类型的日期转换成R的Date类型,这样才能比较先后:
C1$Date <- as.Date(C1$Date, format = "%d-%m-%Y") T1$Date <- as.Date(T1$Date, format = "%d-%m-%Y")
3. 添加年月匹配列
从你的期望结果来看,“对应C1的Date”应该是指同一Artist且同年同月的日期,所以我们给两个DataFrame添加年月列,用来精准匹配:
C1$YearMonth <- format(C1$Date, "%Y-%m") T1$YearMonth <- format(T1$Date, "%Y-%m")
4. 匹配并筛选符合条件的行
我们分两种情况匹配:T1的Artist等于C1的Artist,或者T1的FeatArtist等于C1的Artist,同时保证同年月,且T1的日期晚于C1的日期:
# 匹配T1的Artist与C1的Artist(同年月) match_artist <- merge(T1, C1, by = c("Artist", "YearMonth"), suffixes = c("_T1", "_C1")) # 匹配T1的FeatArtist与C1的Artist(同年月) match_feat <- merge(T1, C1, by.x = c("FeatArtist", "YearMonth"), by.y = c("Artist", "YearMonth"), suffixes = c("_T1", "_C1")) # 合并两种匹配结果,筛选T1日期晚于C1日期的行 filtered_rows <- rbind(match_artist, match_feat) filtered_rows <- filtered_rows[filtered_rows$Date_T1 > filtered_rows$Date_C1, ] # 去重并整理成最终结果格式 final_result <- unique(filtered_rows[, c("Date_T1", "Artist", "FeatArtist")]) colnames(final_result) <- c("Date", "Artist", "FeatArtist") # 把日期转回你需要的字符串格式(可选) final_result$Date <- format(final_result$Date, "%d-%m-%Y")
5. 查看最终结果
运行上述代码后,final_result就是你想要的结果:
print(final_result) # Date Artist FeatArtist # 1 06-11-1955 UNK M # 4 06-05-1956 UNK M # 5 25-11-1956 X UNK
内容的提问来源于stack exchange,提问作者user9740061
相关产品推荐
相关产品推荐

