for循环迭代以在R中创建新列

时间:2020-01-24 14:53:40

标签: r loops

我想对某些列而不是全部进行子串化。例如,如果我有一个数据集:

` data <- data.frame(A = c(100, 200, 300), 
               B = c('A50', 'B60', 'C70')
               c = c(900, 800, 700))

我想对A和B列而不是C进行子串

  select_col <- c("A", "B")

 for col in select_col {
   newcolA = substr(colA, 1, 3)
   newcolB = substr(colB, 1, 3)
  }

如何正确编写for循环?我的实际数据集有数百列,而我有20多个要作为子字符串的列。

2 个答案:

答案 0 :(得分:1)

您可以在列向量(或sapply)上使用lapply

sapply(data[,select_col], substring, 1, 3)

     A     B    
[1,] "100" "A50"
[2,] "200" "B60"
[3,] "300" "C70"

要更改列并将其存储在同一数据框中:

cbind(data, setNames(lapply(data[,select_col], substring, 1, 3), paste0("new", select_col)))
    A    B   c newA newB
1 100 A501 900  100  A50
2 200 B602 800  200  B60
3 300  C70 700  300  C70

答案 1 :(得分:1)

对于新的R用户来说,这可能更直观:

data <- data.frame(A = c(100, 200, 300), 
                   B = c('A50', 'B60', 'C70'),
                   c = c(900, 800, 700))

select_col <- c("A", "B")

for(a in select_col) {
  data[[paste0("newcol", a)]] <- substr(data[[a]], 1, 3)
}

我假设您要将其放入相同的数据框中。如果是这样,那应该可行。否则,您可以创建具有相同行数的新数据框:

newdata <- data.frame(matrix(nrow = 3, ncol = 0))

,然后将循环中的data更改为newdata。如果您实际上希望每个向量都有一个单独的向量(如您的代码所示),则可以使用assign,但我猜您可能不需要。