gpt4 book ai didi

R - 如何按条件和按列操作数据

转载 作者:行者123 更新时间:2023-12-01 09:31:41 25 4
gpt4 key购买 nike

看起来这应该是一个很容易的任务,但我仍然不明白。我有这样的数据:

x1= c(1,1,2,3,1,2,4) 
x2= c(1,2,2,6,2,3,1)
x3= c(1,1,1,0,0,0,0)
x4= c(1,0,0,0,0,3,1)

df=data.frame( x1,x2,x3,x4)
df
x1 x2 x3 x4
1 1 1 1 1
2 1 2 1 0
3 2 2 1 0
4 3 6 0 0
5 1 2 0 0
6 2 3 0 3
7 4 1 0 1

还有一个像这样的向量:

m= c(1,1,0,0)
rbind(df,m)
df=rbind(df,m)
df
x1 x2 x3 x4
1 1 1 1 1
2 1 2 1 0
3 2 2 1 0
4 3 6 0 0
5 1 2 0 0
6 2 3 0 3
7 4 1 0 1
8 1 1 0 0

现在我希望将一列中等于同一列最后一行(m 向量)的值的所有值更改为 0,其他值更改为 1。例如 df[1, 2] 是 1,与 m[2] 相同,因此 df2[1,2] 的值为 0。新数据集将如下所示:

df2
x1 x2 x3 x4
1 0 0 1 1
2 0 1 1 0
3 1 1 1 0
4 1 1 0 0
5 0 1 0 0
6 1 1 0 1
7 1 0 0 1
8 1 1 0 0

最佳答案

rbind 之后使用“df”数据集,我们对除最后一行 (df[-8,]) 之外的所有行和最后一行进行比较被复制以使长度相同。 (df[8,][col(df[-8,])])。这将返回一个逻辑矩阵,可以通过用 + 包装将其强制返回二进制。然后我们将二进制输出与“df”的最后一行(df[8,])进行绑定(bind)以获得预期的输出。

df2 <- rbind(+(df[-8,]!=df[8,][col(df[-8,])]), df[8,])
df2
# x1 x2 x3 x4
#1 0 0 1 1
#2 0 1 1 0
#3 1 1 1 0
#4 1 1 0 0
#5 0 1 0 0
#6 1 1 0 1
#7 1 0 0 1
#8 1 1 0 0

或者正如@DavidArenburg提到的,通过将rbind步骤之前的'df'与向量('m')进行比较,这会变得更加紧凑。

m1 <-  rbind(+(df != m[col(df)]), m)
row.names(m1) <- NULL

为了更好地理解它,我们使用 col 函数复制“m”向量,该函数返回“df”的数字列索引

 col(df)
# [,1] [,2] [,3] [,4]
#[1,] 1 2 3 4
#[2,] 1 2 3 4
#[3,] 1 2 3 4
#[4,] 1 2 3 4
#[5,] 1 2 3 4
#[6,] 1 2 3 4
#[7,] 1 2 3 4

使用

 m[col(df)]
#[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

“m”中的第一个元素(即 1)被复制 7 次,然后第二个元素 1 被复制 7 次,依此类推...

现在,长度是相同的

 length( m[col(df)])
#[1] 28
prod(dim(df))
#[1] 28

进行逐个元素的比较。

 df != m[col(df)]
# x1 x2 x3 x4
#[1,] FALSE FALSE TRUE TRUE
#[2,] FALSE TRUE TRUE FALSE
#[3,] TRUE TRUE TRUE FALSE
#[4,] TRUE TRUE FALSE FALSE
#[5,] FALSE TRUE FALSE FALSE
#[6,] TRUE TRUE FALSE TRUE
#[7,] TRUE FALSE FALSE TRUE

在最后一步中,我们将其强制转换为二进制并 rbind 为“m”。


另一种选择是使用 sweepMARGIN=2

rbind(+(sweep(df, 2 ,m ,'!=')), m)

关于R - 如何按条件和按列操作数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32164799/

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