用ifelse和替代品分配因子水平

时间:2018-04-21 12:50:33

标签: r

我有多个数据帧,我可以合并和融合。融化后,我想根据行所属的原始数据帧为长数据帧添加一个标识符。

library(reshape2)
df1 <- data.frame(User=factor(LETTERS[24:26]), A=c(1,2,3), B=c(1,2,3))
df2 <- data.frame(User=factor(LETTERS[23:25]), C=c(1,2,3), D=c(1,2,3))

df.comb <- merge(df1, df2, by="User", all=T)
df.m <- melt(df.comb, id.vars="User")

这里我根据df1和df2的列名中cat中变量(A,B,C,D)的外观来分配因子df.m$variables

df.m$cat <- ifelse(df.m$variable %in% names(df1) , "df1",
                   ifelse(df.m$variable %in% names(df2),  "df2", "df1"))

不幸的是,我有更多的数据帧(总共9个);因此ifelse变得非常乏味和复杂(如果可能的话,我没有尝试过)。

df3 <- data.frame(User=factor(LETTERS[22:24]), E=c(1,2,3), F=c(1,2,3))

df.comb <- merge(merge(df1, df2, by="User", all=T), df3, by="User", all=T)
df.m <- melt(df.comb, id.vars="User")

根据数据框列名中df.m$cat的外观来分配df.m$variable的最佳方法是什么?我所有数据框的列名都是唯一的。

1 个答案:

答案 0 :(得分:1)

您可以使用case_when中的dplyr。如果其他选项都不起作用,则TRUE是else部分。

library(dplyr)
df.m$cat <- as.factor(case_when(df.m$variable %in% names(df1) ~ "df1", 
                                df.m$variable %in% names(df2) ~ "df2", 
                                df.m$variable %in% names(df3) ~ "df3",
                                TRUE ~ "No df"))