首页 > 解决方案 > 根据列删除值

问题描述

我有以下data.frame。我想做2个转换。

输入 :

 id t1 t2 t3 t4 t5 t6 t7 t6 t8 t9
  1  s  s  s  w  r  r  t  t  w  s
  2  s  s  s  o  o  w  t  t  o  s
  3  s  s  s  o  w  w  t  t  o  s
  4  s  s  s  o  o  w  t  t  o  s
  5  s  s  s  s  s  s  w  w  s  s
  6  s  s  s  w  t  t  w  w  w  s

我想删除的第一个值出现在“第一个 w”之后:

输出:

 id t1 t2 t3 t4 t5 t6 t7   
  1  s  s  s  w  
  2  s  s  s  o  o  w  
  3  s  s  s  o  w  
  4  s  s  s  o  o  w  
  5  s  s  s  s  s  s  w  
  6  s  s  s  w  t  t  w 

我想保存这个数据框。

在第二步中,我想将删除的部分保存到一个新的数据框中。

id  t5 t6 t7 t6 t8 t9
  1  r  r  t  t  w  s
  2     w  t  t  o  s
  3     w  t  t  o  s
  4     w  t  t  o  s
  5           w  s  s
  6           w  w  s

样本数据

df1<-structure(list(id=c(1,2,3,4,5,6), t1=c("s","s","s","s","s","s"), t2=c("s","s","s","s","s","s"),t3 = c("s","s","s","s","s","s"),
                    t4 = c("w","o","o","o","s","w"), t5 = c("r","o","w","o","s","t"), t6 = c("r","w","w","w","s","t"),
                    t7 = c("t","t","t","t","w","w"),t6 = c("t","t","t","t","w","w"), t8 = c("w","o","o","o","s","w"), t9=c("s","s","s","s","s","s")), row.names = c(NA, 6L), class = "data.frame")

df1

欢迎任何帮助

标签: rdataframe

解决方案


一个循环选项apply是循环遍历行(MARGIN = 1),找到第一个'w'的位置(match),replace该位置之后的元素为空白(""

df2 <- df1
df2[-1] <- t(apply(df1[-1], 1, function(x) 
         replace(x, seq_along(x) > match('w', x), '')))

第二种情况是将条件从>更改<=replace

df3 <- df1
df3[-1] <- t(apply(df1[-1], 1, function(x) 
          replace(x, seq_along(x) <= match('w', x), '')))

并仅选择具有至少一个非空白元素的列

df3 <- df3[c(TRUE, colSums(df3[-1] != '') > 0)]

推荐阅读