R 如何在一次运行中删除基于不同弧坑的行
我有一个数据看起来像这样R 如何在一次运行中删除基于不同弧坑的行,r,R,我有一个数据看起来像这样 df<- structure(list(V2 = c(15L, 20L, 0L, 0L, 0L, 40L, 0L, 1538100000L, 0L), V3 = c(142480000L, 20L, 0L, 0L, 100L, 0L, 0L, 1444000000L, 100L), V4 = c(170130000L, 0L, 0L, 1577400000L, 0L, 0L, 1577400000L, 1577400000L, 20L), V5 = c(17
df<- structure(list(V2 = c(15L, 20L, 0L, 0L, 0L, 40L, 0L, 1538100000L,
0L), V3 = c(142480000L, 20L, 0L, 0L, 100L, 0L, 0L, 1444000000L,
100L), V4 = c(170130000L, 0L, 0L, 1577400000L, 0L, 0L, 1577400000L,
1577400000L, 20L), V5 = c(176030000L, 0L, 0L, 176030000L, 0L,
20431000L, 0L, 1449700000L, 0L)), .Names = c("V2", "V3", "V4",
"V5"), class = "data.frame", row.names = c("A", "B", "C", "D",
"F", "G", "H", "I", "J"))
# V2 V3 V4 V5
#A 15 142480000 170130000 176030000
#B 20 20 0 0
#C 0 0 0 0
#D 0 0 1577400000 176030000
#F 0 100 0 0
#G 40 0 0 20431000
#H 0 0 1577400000 0
#I 1538100000 1444000000 1577400000 1449700000
#J 0 100 20 0
df[rowSums(df)>0, ]
# V2 V3 V4 V5
#A 15 142480000 170130000 176030000
#B 20 20 0 0
#D 0 0 1577400000 176030000
#I 1538100000 1444000000 1577400000 1449700000
现在我想删除那些只有一个值,其余为零的行
然后我想删除一半值为零的列(右或左)
预期输出应该如下所示
df<- structure(list(V2 = c(15L, 20L, 0L, 0L, 0L, 40L, 0L, 1538100000L,
0L), V3 = c(142480000L, 20L, 0L, 0L, 100L, 0L, 0L, 1444000000L,
100L), V4 = c(170130000L, 0L, 0L, 1577400000L, 0L, 0L, 1577400000L,
1577400000L, 20L), V5 = c(176030000L, 0L, 0L, 176030000L, 0L,
20431000L, 0L, 1449700000L, 0L)), .Names = c("V2", "V3", "V4",
"V5"), class = "data.frame", row.names = c("A", "B", "C", "D",
"F", "G", "H", "I", "J"))
# V2 V3 V4 V5
#A 15 142480000 170130000 176030000
#B 20 20 0 0
#C 0 0 0 0
#D 0 0 1577400000 176030000
#F 0 100 0 0
#G 40 0 0 20431000
#H 0 0 1577400000 0
#I 1538100000 1444000000 1577400000 1449700000
#J 0 100 20 0
df[rowSums(df)>0, ]
# V2 V3 V4 V5
#A 15 142480000 170130000 176030000
#B 20 20 0 0
#D 0 0 1577400000 176030000
#I 1538100000 1444000000 1577400000 1449700000
已删除名为C的行,因为所有成员均为零
F被删除,因为其中只有一个值,其余为零
G被删除是因为(假设我们有4列,我们应该有
2的值前2个或后2个)和G有两个值
但这并不接近
H被删除,因为它只有一个值
J被删除,因为在两个开始时也没有两个值
列或最后两列
第一次尝试
df[rowSums(df) > 0 & rowSums(df==0) != ncol(df)-1 & df[,1] != 0 & df[,2] !=0 | df[,3] !=0 & df[,4] !=0,]
# V2 V3 V4 V5
# A 15 142480000 170130000 176030000
# B 20 20 0 0
# D 0 0 1577400000 176030000
# I 1538100000 1444000000 1577400000 1449700000
二,。要了解已删除行的索引值,请在which()
函数中设置相反的条件
which(rowSums(df) <= 0)
# C
# 3
which(rowSums(df==0) == ncol(df)-1)
# F H
# 5 7
which(行和(df)I.第一次尝试
df[rowSums(df) > 0 & rowSums(df==0) != ncol(df)-1 & df[,1] != 0 & df[,2] !=0 | df[,3] !=0 & df[,4] !=0,]
# V2 V3 V4 V5
# A 15 142480000 170130000 176030000
# B 20 20 0 0
# D 0 0 1577400000 176030000
# I 1538100000 1444000000 1577400000 1449700000
二、 要了解已删除行的索引值,请在which()
函数中设置相反的条件
which(rowSums(df) <= 0)
# C
# 3
which(rowSums(df==0) == ncol(df)-1)
# F H
# 5 7
which(行和(df)使用临时变量
## logical array indicating non-zero elements
nz <- array(df != 0, c(dim(df) / c(1, 2), 2))
rowSums(nz) > 1 # conditions 1 & 2
#[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE TRUE TRUE
## rows with no zeros in the left half
apply(nz[, , 1], 1, all)
#[1] TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
## rows with no zeros in the right half
apply(nz[, , 2], 1, all)
#[1] TRUE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE
## rows with no zeros in either the left or the right half
rowSums(apply(nz, c(1, 3), all)) > 0 # condition 3
#[1] TRUE TRUE FALSE TRUE FALSE FALSE FALSE TRUE FALSE
表示非零元素的逻辑数组
新西兰1#条件1和2
#[1] 真假假假真假假真
##左半部分没有零的行
适用(新西兰[,1],1,全部)
#[1] 真假假假假假假真假
##右半部分没有零的行
适用(新西兰[,2],1,全部)
#[1] 真假假假假假假真假假
##左半部分或右半部分都没有零的行
行和(适用(nz,c(1,3),全部))>0#条件3
#[1] 真假真假假假真假假假
我认为前两个条件是多余的
## rows that satisfy all conditions simultaneously
ind <- rowSums(nz) > 1 & rowSums(apply(nz, c(1, 3), all)) > 0
which(ind)
#[1] 1 2 4 8
df[ind, ]
# V2 V3 V4 V5
#A 15 142480000 170130000 176030000
#B 20 20 0 0
#D 0 0 1577400000 176030000
#I 1538100000 1444000000 1577400000 1449700000
同时满足所有条件的行
索引1和行和(适用于(新西兰,c(1,3),全部))>0
哪个(ind)
#[1] 1 2 4 8
df[ind,]
#V2 V3 V4 V5
#A 15 142480000 170130000 176030000
#B20200
#D 0 15774000176030000
#I 1538100000 1444000000 15774000000 1449700000
使用临时变量
## logical array indicating non-zero elements
nz <- array(df != 0, c(dim(df) / c(1, 2), 2))
rowSums(nz) > 1 # conditions 1 & 2
#[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE TRUE TRUE
## rows with no zeros in the left half
apply(nz[, , 1], 1, all)
#[1] TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
## rows with no zeros in the right half
apply(nz[, , 2], 1, all)
#[1] TRUE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE
## rows with no zeros in either the left or the right half
rowSums(apply(nz, c(1, 3), all)) > 0 # condition 3
#[1] TRUE TRUE FALSE TRUE FALSE FALSE FALSE TRUE FALSE
表示非零元素的逻辑数组
新西兰1#条件1和2
#[1] 真假假假真假假真
##左半部分没有零的行
适用(新西兰[,1],1,全部)
#[1] 真假假假假假假真假
##右半部分没有零的行
适用(新西兰[,2],1,全部)
#[1] 真假假假假假假真假假
##左半部分或右半部分都没有零的行
行和(适用(nz,c(1,3),全部))>0#条件3
#[1] 真假真假假假真假假假
我认为前两个条件是多余的
## rows that satisfy all conditions simultaneously
ind <- rowSums(nz) > 1 & rowSums(apply(nz, c(1, 3), all)) > 0
which(ind)
#[1] 1 2 4 8
df[ind, ]
# V2 V3 V4 V5
#A 15 142480000 170130000 176030000
#B 20 20 0 0
#D 0 0 1577400000 176030000
#I 1538100000 1444000000 1577400000 1449700000
同时满足所有条件的行
索引1和行和(适用于(新西兰,c(1,3),全部))>0
哪个(ind)
#[1] 1 2 4 8
df[ind,]
#V2 V3 V4 V5
#A 15 142480000 170130000 176030000
#B20200
#D 0 15774000176030000
#I 1538100000 1444000000 15774000000 1449700000
注意:这不是最后一个条件的通用公式,即删除左半部或右半部没有连续非零值的行。它特定于这一个。前两个条件是通用的。你能让它变得不那么复杂吗?即使不是在一次运行中,也可以!我如何找到删除的行(我的意思是它们的索引)。请用扩展的方式更新您的答案,保留您所写的内容,以便我可以查看it@nik:请编辑问题的第三部分,即左半部分和右半部分,您提到需要删除列而不是行,并且左半部分和右半部分的连续值应为零。如何输入输出如果非零值在左半部分或左半部分是连续的,请检查它们。我喜欢你的答案,但我认为问题不应该是更改语句
,然后我想删除一半值为零的列(右或左)
如果您在输出中看到左或右都有r行带半个零&ur其他语句G被删除,因为(假设我们有4列,那么前2列或后2列中应该有2的值)和G有两个值,但不接近
,J被删除,因为在两个第一列或两个最后列上都没有两个值
。RU检查非零
或零
列的前半部分的值?注:这不是最后一个条件的通用公式,即删除没有con的行左半或右半的连续非零值。这是特定于此的。前两个条件是通用的。你能让它不那么复杂吗?即使它不是一次运行,也没关系!还有,我如何找到哪些行被删除(我的意思是它们的索引)。请用扩展的方式更新您的答案,保留您所写的内容,以便我可以查看it@nik:请编辑问题的第三部分,即左半部分和右半部分,您提到需要删除列而不是行,并且左半部分和右半部分的连续值应为零。如何输入输出如果非零值在左半部分或左半部分是连续的,请检查它们。我喜欢你的答案,但我认为问题不应该是更改语句,然后我想删除一半值为零的列(右或左)
如果您在输出中看到左或右都有r行带半个零&ur其他语句G被删除,因为(假设我们有4列,那么前2列或后2列中应该有2的值)G有两个值,但不接近
&J被删除,因为在两个第一列或两个最后列没有两个值