我有一个很大的df,我已经简化了,我想创建两个新的列K_status和S_status,基于另一列中的变量,我正在努力如何最好地为此编码。
A <- c("K", "K", "K", "S", "S", "S", "NA")
B <- c("NA", "AA", "AC", "NA", "AA", "AB", "LD")
C <- c("TT", "YY", "YY", "TT", "YY", "Y", "TT")
df <- data.frame(A, B, C)
要生成用于df的K_status和S_status附加列,我当前的代码是:
df <- df %>%
mutate(K_status = case_when(all("K", "AA", "YY") %in% df) ~ "Mut",
TRUE ~ "WT")) %>%
mutate(S_status = case_when(all("S", "AB", "Y") %in% df) ~ "Mut",
TRUE ~ "WT"))
这段代码不起作用,因为我想要的新df应该如下所示
A <- c("K", "K", "K", "S", "S", "S", "NA")
B <- c("NA", "AA", "AC", "NA", "AA", "AB", "LD")
C <- c("TT", "YY", "YY", "TT", "YY", "Y", "TT")
K_status <- c("WT", "Mut", "WT", "WT", "WT", "WT", "WT")
S_status <- c("WT", "WT", "WT", "WT", "WT", "Mut", "WT")
df <- data.frame(A, B, C, K_status, S_status)
在编写这段代码以生成K_status和S_status时,我们将非常感谢任何帮助。谢谢。
2条答案
按热度按时间p1tboqfb1#
我们可以使用
base R
-使用rowSums
创建逻辑向量,然后根据它进行赋值,这样效率会更高或者以矢量化的方式使用
tidyverse
,以便高效执行代码-只需创建一个键/值数据集或一个名为list
的,然后循环if_all
中的列,从keydat数据集中提取相应的值,比较并使用case_when
创建新列omhiaaxx2#
我们可以使用类似的代码后纠正几个不一致:
x %in% z
时包含rowwise
,其中z按行使用%in% df
应替换为对 Dataframe A:C列的正确引用,即c_across
。all(c(...) %in% x)
代替all(...) %in% x