我想对某些列而不是全部进行子串化。例如,如果我有一个数据集:
` 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多个要作为子字符串的列。
答案 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
,但我猜您可能不需要。