R语法如何工作?由[apply()与match()]在for循环中选择性使用gsub()

时间:2018-09-26 14:52:54

标签: r syntax match apply gsub

有时候,我从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]])] <- ""
}

2 个答案:

答案 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 = jmatch1之间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