有时候,我从StackOverflow改编了一些代码,但是我一直找不到原始帖子。该代码对于我的应用程序工作正常,但是我并没有真正“了解”语法。 (代码通过将数字数据值与“ new_labels”向量中的对应值进行匹配来覆盖具有特定字符串的数据中的数字值。该匹配是针对列的。)
参考下面的代码,有人可以解释[apply]子句如何用于指定gsub()在哪里进行替换吗?或者换种说法,这种语法如何工作?为什么应用会影响gsub()?更好的是,是否有一种更简单的方法来执行此操作?
# reproducible example
# fake data
dat <- tibble(var1 = c(1,NA, 1,1,1,2,1,NA,1,1),
var2 = c(NA,1,NA,NA,NA,NA,NA,1,NA,NA),
var3 = c(2,2,NA,2,NA,1,2,NA,NA,NA),
var4 = c(NA,NA,2,NA,2,NA,NA,2,2,2))
# names of columns in fake data
variables <- names(dat)
# names of new labels to replace the numeric values
new_labels <- c("elf", "hobbit", "wizard", "ranger")
# empty list
llist <- list(ones = data.frame(matrix(ncol=4,nrow=10)),
twos = data.frame(matrix(ncol=4,nrow=10)))
names(llist[[1]]) <- letters[1:length(new_labels)]
names(llist[[2]]) <- letters[1:length(new_labels)]
# for loops
for(j in 1:2){
for(i in 1:length(new_labels)){
llist[[j]][, letters[i]] <- gsub(variables[i], new_labels[i], names(dat[,variables[i]]))[apply(dat[,variables[i]], 1, match, x= j)]
}
llist[[j]][is.na(llist[[j]])] <- ""
}
答案 0 :(得分:1)
让我们将其拉出循环,看看到底发生了什么。
gsub(variables[1], new_labels[1], names(dat[,variables[1]]))[apply(dat[,variables[1]], 1, match, x = 1)]
[1] "elf" NA "elf" "elf" "elf" NA "elf" NA "elf" "elf"
查看?apply
的帮助:apply(X, MARGIN, FUN, ...)
,其中x
是我们首先循环到的dat
的列,1
是页边距,?match
是它正在应用的函数,x = j
是match
和1
之间2
的{{1}}循环的一部分。 )。同样,如果找到for(j in 1:2)
的匹配项,则替换为1
。
1
然后apply(dat[,variables[1]], 1, match, x = 1)
[1] 1 NA 1 1 1 NA 1 NA 1 1
用第一个gsub
的名字new_labels
替换第一个(elf)
的名字variables
,并将其写入{的匹配元素{1}}((var1)
是letters[i]
)。因此,它将在与letters[1]
匹配的列中a
的第一个list
元素(名为llist
)中找到一个匹配项。
对于每个标签的所有ones
值,然后对每个列表元素,然后对所有a
值,等等重复此操作。第一行变成第二行。
1
这是一个相当优雅的过程。
这里是没有循环的逐步说明,因此您基本上可以看到循环的作用。
2
答案 1 :(得分:1)
这里有很多嵌套,但是要了解功能,最好的方法是在控制台中运行最嵌套的部分并向外工作。
让我们假设i = 1和j = 1
@interface NSCharacterSet (NSURLUtilities)
+ (NSCharacterSet *)URLUserAllowedCharacterSet;
+ (NSCharacterSet *)URLPasswordAllowedCharacterSet;
+ (NSCharacterSet *)URLHostAllowedCharacterSet;
+ (NSCharacterSet *)URLPathAllowedCharacterSet;
+ (NSCharacterSet *)URLQueryAllowedCharacterSet;
+ (NSCharacterSet *)URLFragmentAllowedCharacterSet;
@end
适用于被馈送数据的子集,即“ var1”列。然后将match应用于该列的每个索引,如果索引中的值与x参数匹配,则返回1,否则返回NA。
将此向量命名为apply(dat[,variables[i]], 1, match, x= j)
,然后将其传递给vec
。
names(dat[,variables[i]]))[vec]
似乎只返回names(dat[,variables[i]])
,因此在此示例中似乎毫无意义。
variable[i]
用names(dat[,variables[i]]))[vec]
中的值替换vec
中的每个1值
最后,在variables[i]
中
gsub(pattern = variables[i], new_labels[i], new.vec)
是new.vec