I'm trying to add a column to a dataframe within a function.
My underlying question is: how does one pass a variable name into a function in a way that this variable can be used to address specific columns?
I've read quite a few posts with similar questions, and I can add the column with some code I copy/pasted, but I really need/want understanding why/how of how it works.
Here's the basic working example:
abby <- tibble(a = 1:20)
bill <- function(x, nc) {
x = x %>% add_column(!!nc := 0)
}
newabby <- bill(abby, "newCol")
This does what I need. It adds a column based on the variable given to the function.
newabby looks like this
# A tibble: 20 x 2
a newCol
<int> <dbl>
1 1 0
2 2 0
3 3 0
...
Here are my questions:
-
What does the "!!" mean and do in this function? (I've tried google and read like 4 posts on R operators and still have no idea
-
Same question for the ":"?
-
Why does this not work:
bill <- function(x, nc) {
x[,nc} <-0
}
where something like
bill <- function(x, nc) {
print(x[,nc])
}
works fine?
Let me ask about another example:
(Since I already have your attention and you're being very kind by reading this.)
I need to iterate through rows, addressing a column the name of which comes from a variable given to the function.
I want to use a loop to perform a function row by row. In other words, I want to do what is shown below, but need to be able to choose the column by passing a variable to the function.
I start with abby
abby <- tibble(a = 1:30)
and here's what I want to do
for (i in 1:20) {
print(abby$a[i])
}?
I can do this but the result is similar, but not quite the same:
eddie <- function(x, clmn) {
for (i in 1:20) {
print(x[i, clmn])
}
}
How would I do this same thing as the eddie function above, but for the x$clmn[i] format, not the x[i, clmn] format?
Thanks so much for any help!