r - 改进我的编码 "for loop"

标签 r for-loop if-statement

下面是一个简单的循环,用于在检查特定条件后(如果两个连续行具有相同的值)在数据框中插入新列。 该代码工作得很好,但我想提高我的编码技能,所以我要求替代解决方案(更快、更优雅)。 我查看了之前有关该主题的帖子并学到了很多东西,但我对我的具体案例感到好奇。 感谢您的任何意见。

vector<-1
vector_tot<-NULL

  for(i in 1:length(dat$Label1))
  { 
     vector_tot<-c(vector_tot,vector)
     if(dat$Label1[i]==dat$Label1[i+1]){
    vector<-0  
    }
    else {
      vector<-1
      }
      }


dat$vector<- vector_tot

最佳答案

对于 R 中的许多事情,您不需要 for 循环,因为函数是矢量化的。所以我们可以通过以下方式实现您想要的:

# sample data
dat <- data.frame(Label1=c("A","B","B","C","C","C","D"),stringsAsFactors = F)

# first create a vector that contains the previous value
dat$next_element <- c(dat$Label1[2:nrow(dat)],"")

# then check if they match
dat$vector <- as.numeric(dat$Label1==dat$next_element)

输出:

  Label1 next_element vector
1      A            B      0
2      B            B      1
3      B            C      0
4      C            C      1
5      C            C      1
6      C            D      0
7      D                   0

它也可以在一行中完成,但我认为上面更好地说明了它是如何工作的:

dat$vector <- dat$Label1==c(dat$Label1[2:nrow(dat)],"")

或者与前一个元素进行比较:

dat$vector <- dat$Label1==c("",dat$Label1[1:nrow(dat)-1])

关于r - 改进我的编码 "for loop",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45347293/

相关文章:

r - 为 sf 对象创建距离矩阵

for-loop - pl/sql循环记录select oracle plsql

mysql 仅当一个字段为空时才进行多次更新

php - 检测第一个字母字符

perl - Perl 中针对多个模式的字符串匹配

r - 如何对 PCoA 的散点图进行颜色编码

r - 如何减少以不包含 NA 的特定变量为条件的大量矩阵

r - 如何引用给定行以在基数 100 中创建变量

javascript - For循环,我需要打印出从1到20的数字

python - 如何按顺序循环/解析表行而不跳到变量的下一个实例?