r - 根据行的值删除列

标签 r dataframe row

给定两个数据框:

 C1<-c(3,4,4,4,5)
 C2<-c(3,7,3,4,5)
 C3<-c(5,6,3,7,4)
 DF<-data.frame(C1=C1,C2=C2,C3=C3)
 DF
   C1 C2 C3
1  3  3  5
2  4  7  6
3  4  3  3
4  4  4  7
5  5  5  4

V1<-c(3,2,2,4,5)
V2<-c(3,7,3,5,2)
V3<-c(5,2,5,7,5)
V4<-c(1,1,2,3,4)
V5<-c(1,2,6,7,5)
DF2<-data.frame(V1=V1,V2=V2,V3=V3,V4=V4,V5=V5)
DF2
  V1 V2 V3 V4 V5
1  3  3  5  1  1
2  2  7  2  1  2
3  2  3  5  2  6
4  4  5  7  3  7
5  5  2  5  4  5

查看两个数据框中的每个等效行,C3 中的值与我想要在 DF2 中同一行中删除的列数之间存在关系。

C3 中的值与 DF2 中要删除的列数之间的关系如下所示

If C3≥7 drop V5
If C3=6.0:6.9 drop V4 and up (so basically V5,V4)
If C3=5.0:5.9 drop V3 and up (so basically V5,V4,V3)
If C3=4.0:4.9 drop V2 and up (so basically V5,V4,V3,V2)
If C3≤3.9 drop entire row

对于此示例,根据 C3 的值,我希望 DF2 看起来像这样

  V1 V2 V3 V4 V5
1  3  3
2  2  7  2

4  4  5  7  3 
5  5

我尝试编写一个简单的脚本来执行此操作(我很新,所以我喜欢保持简单,这样我就可以看到发生了什么),但我左右抛出错误,所以我会很感激一些关于如何进行的建议

最佳答案

我喜欢 Koshke 的答案,但如果您设置为 NA 的规则没有很好的数学属性,或者您需要任意定义规则,那么这种方法应该为您提供灵 active 。首先,定义一个函数,根据您的规则返回要删除的列:

f <- function(x) {
  if(x >= 7){
    out <- 5
  }else if(x >= 6.0){
           out <- 4:5
  } else if( x >= 5.0){
    out <- 3:5
  } else if (x >= 4.0){
    out <- 2:5
  } else {
    out <- 1:5
  }
  return(out)
}

接下来,为要删除的列索引创建一个列表:

z <- lapply(DF$C3, f)

最后,循环遍历每一行,将相应的列设置为 NA:

for(j in seq(length(z))){
  DF2[j, z[[j]]] <- NA
}

#-----
  V1 V2 V3 V4 V5
1  3  3 NA NA NA
2  2  7  2 NA NA
3 NA NA NA NA NA
4  4  5  7  3 NA
5  5 NA NA NA NA

关于r - 根据行的值删除列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11044090/

相关文章:

powershell - 如何抑制输出

linux - 在 R studio 中使用标准输入

python - python 中的向量化 get() 方法

python - 如何降低二进制数据的维数?

python - 测试数据框 pandas 中的行是否为 NULL 值

apache-flex - 如何动态改变datagrid行的背景颜色?

c# - WPF Datagrid - 强制单行行

R标准化数据框中的数字变量,同时保留因子变量

回归模型点估计

javascript - 以编程方式预先选择 Material-UI 数据网格中的一行(React)