gpt4 book ai didi

r - 如果行中的变量在 R 中匹配或不匹配,如何将 1 和 0 分配给列

转载 作者:行者123 更新时间:2023-12-02 18:30:02 25 4
gpt4 key购买 nike

我是编码和 R 方面的绝对初学者,这是我为项目做这件事的第三周。 (对于生物学家来说,我正在尝试找到 PRS 风险等位基因的总和)但这部分我需要帮助

df
x y z
1 t c a
2 a t a
3 g g t

所以当应用代码时:

  x y z
1 t 0 0
2 a 0 1
3 g 1 0
```

I'm trying to make it that if the rows in y or z match x the value changes to 1 and if not, zero
I started with:
```
for(i in 1:ncol(df)){
df[, i]<-df[df$x == df[,i], df[ ,i]<- 1]
}
```
But got all NA values
In reality, I have 100 columns I have to compare with x in the data frame. Any help is appreciated

最佳答案

实现此目的的另一种方法是在基础 R 中使用 ifelse()

df$y <- ifelse(df$y == df$x, 1, 0)
df$z <- ifelse(df$z == df$x, 1, 0)
df
# x y z
#1 t 0 0
#2 a 0 1
#3 g 1 0

编辑以将此步骤有效地扩展到所有列

例如:

df1
# x y z w
#1 t c a t
#2 a t a a
#3 g g t m

要有效地应用列编辑,更好的方法是使用应用于数据框中所有目标列的函数。这是一个完成这项工作的简单函数:

edit_col <- function(any_col) any_col <- ifelse(any_col == df1$x, 1, 0)

该函数获取一列,然后将该列中的元素与 df1$x 的元素进行比较,然后相应地编辑该列。该函数需要单列。要将其应用于所有目标列,您可以使用 apply()。因为在您的情况下,x 不是目标列,所以您需要通过索引 [,-1] 来排除它,因为它是 df 中的第一列。

# Here number 2 indicates columns. Use number 1 for rows.

df1[, -1] <- apply(df1[,-1], 2, edit_col)
df1
# x y z w
#1 t 0 0 1
#2 a 0 1 1
#3 g 1 0 0

当然,您也可以定义一个编辑数据框的函数,这样您就不需要手动执行apply()

这是此类函数的示例

edit_df <- function(any_df){
edit_col <- function(any_col) any_col <- ifelse(any_col == any_df$x, 1, 0)

# Create a vector containing all names of the targeted columns.

target_col_names <- setdiff(colnames(any_df), "x")

any_df[,target_col_names] <-apply( any_df[,target_col_names], 2, edit_col)
return(any_df)
}

然后使用该函数:

edit_df(df1)
# x y z w
#1 t 0 0 1
#2 a 0 1 1
#3 g 1 0 0

关于r - 如果行中的变量在 R 中匹配或不匹配,如何将 1 和 0 分配给列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69547791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com