function works on one element of list, doesn't work on full list, R
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}
I'm trying to make a function to add tags to a data frame.
The name of the data frame contains the information I need (date, selection, treatment, etc...). So I made a function that extracts the information I need. I have a large list containing all the data frames, and when I apply the function to the list, it does create the new columns for the tags but the values are NA-s. Every data frame has the same name structure, and if I extract a data frame from the list and run the function it works. Can you help me find out why doesn't it work when I apply it to the list?
here is my function :
library(stringr)
tagging <- function(H){
namey<-deparse(substitute(H)) #get the name of the data frame
namey<- str_sub(namey,1, -5) #drop the .csv
H$date<-substring(namey,1, 6) # get the first 6 characters containing the date
H$selection<- word(namey, -1) #get the last word
H$treatment<- word(namey, -2) # get the second last word
H$REP<- word(namey, -3) # get the third last word
return(H)
}
And I apply it like this
ListofData.tagged<-lapply(ListofData, tagging)
The name of the data frames looks like this:
180503 xyz1-6 R4_A6_xyz 5 yes.csv
r list function user-defined-functions lapply
|
show 1 more comment
I'm trying to make a function to add tags to a data frame.
The name of the data frame contains the information I need (date, selection, treatment, etc...). So I made a function that extracts the information I need. I have a large list containing all the data frames, and when I apply the function to the list, it does create the new columns for the tags but the values are NA-s. Every data frame has the same name structure, and if I extract a data frame from the list and run the function it works. Can you help me find out why doesn't it work when I apply it to the list?
here is my function :
library(stringr)
tagging <- function(H){
namey<-deparse(substitute(H)) #get the name of the data frame
namey<- str_sub(namey,1, -5) #drop the .csv
H$date<-substring(namey,1, 6) # get the first 6 characters containing the date
H$selection<- word(namey, -1) #get the last word
H$treatment<- word(namey, -2) # get the second last word
H$REP<- word(namey, -3) # get the third last word
return(H)
}
And I apply it like this
ListofData.tagged<-lapply(ListofData, tagging)
The name of the data frames looks like this:
180503 xyz1-6 R4_A6_xyz 5 yes.csv
r list function user-defined-functions lapply
4
Could you prove a minimal example of whatListofData
contains?
– Anders Ellern Bilgrau
Nov 16 '18 at 18:08
Looks like it is the file name instead of the object name. I think you need to loop through the names of theListofData
?
– akrun
Nov 16 '18 at 18:10
Trymap(names(ListofDatalst), ~ str_sub(.x, 1, -5))
– akrun
Nov 16 '18 at 18:15
The problem is alapply
problem: it passesX[[1]]
, thenX[[2]]
, etc to the function. Putcat("namey:", namey, "n")
right afterdeparse/substitute
to see what is the df name in the function.
– Rui Barradas
Nov 16 '18 at 18:17
Anders Ellern Bilgrau : ListofData contains 300 data frames. Each dataframe has the same structure, same variables and the same "structure" for the name. akrun : the name of the file is the name of the object, because I import the .csv files as follows : temp = list.files(pattern="*.csv") ListofData = lapply(temp, read.csv)
– user163731
Nov 16 '18 at 18:19
|
show 1 more comment
I'm trying to make a function to add tags to a data frame.
The name of the data frame contains the information I need (date, selection, treatment, etc...). So I made a function that extracts the information I need. I have a large list containing all the data frames, and when I apply the function to the list, it does create the new columns for the tags but the values are NA-s. Every data frame has the same name structure, and if I extract a data frame from the list and run the function it works. Can you help me find out why doesn't it work when I apply it to the list?
here is my function :
library(stringr)
tagging <- function(H){
namey<-deparse(substitute(H)) #get the name of the data frame
namey<- str_sub(namey,1, -5) #drop the .csv
H$date<-substring(namey,1, 6) # get the first 6 characters containing the date
H$selection<- word(namey, -1) #get the last word
H$treatment<- word(namey, -2) # get the second last word
H$REP<- word(namey, -3) # get the third last word
return(H)
}
And I apply it like this
ListofData.tagged<-lapply(ListofData, tagging)
The name of the data frames looks like this:
180503 xyz1-6 R4_A6_xyz 5 yes.csv
r list function user-defined-functions lapply
I'm trying to make a function to add tags to a data frame.
The name of the data frame contains the information I need (date, selection, treatment, etc...). So I made a function that extracts the information I need. I have a large list containing all the data frames, and when I apply the function to the list, it does create the new columns for the tags but the values are NA-s. Every data frame has the same name structure, and if I extract a data frame from the list and run the function it works. Can you help me find out why doesn't it work when I apply it to the list?
here is my function :
library(stringr)
tagging <- function(H){
namey<-deparse(substitute(H)) #get the name of the data frame
namey<- str_sub(namey,1, -5) #drop the .csv
H$date<-substring(namey,1, 6) # get the first 6 characters containing the date
H$selection<- word(namey, -1) #get the last word
H$treatment<- word(namey, -2) # get the second last word
H$REP<- word(namey, -3) # get the third last word
return(H)
}
And I apply it like this
ListofData.tagged<-lapply(ListofData, tagging)
The name of the data frames looks like this:
180503 xyz1-6 R4_A6_xyz 5 yes.csv
r list function user-defined-functions lapply
r list function user-defined-functions lapply
edited Nov 16 '18 at 18:11
Rui Barradas
18.3k51833
18.3k51833
asked Nov 16 '18 at 18:06
user163731user163731
61
61
4
Could you prove a minimal example of whatListofData
contains?
– Anders Ellern Bilgrau
Nov 16 '18 at 18:08
Looks like it is the file name instead of the object name. I think you need to loop through the names of theListofData
?
– akrun
Nov 16 '18 at 18:10
Trymap(names(ListofDatalst), ~ str_sub(.x, 1, -5))
– akrun
Nov 16 '18 at 18:15
The problem is alapply
problem: it passesX[[1]]
, thenX[[2]]
, etc to the function. Putcat("namey:", namey, "n")
right afterdeparse/substitute
to see what is the df name in the function.
– Rui Barradas
Nov 16 '18 at 18:17
Anders Ellern Bilgrau : ListofData contains 300 data frames. Each dataframe has the same structure, same variables and the same "structure" for the name. akrun : the name of the file is the name of the object, because I import the .csv files as follows : temp = list.files(pattern="*.csv") ListofData = lapply(temp, read.csv)
– user163731
Nov 16 '18 at 18:19
|
show 1 more comment
4
Could you prove a minimal example of whatListofData
contains?
– Anders Ellern Bilgrau
Nov 16 '18 at 18:08
Looks like it is the file name instead of the object name. I think you need to loop through the names of theListofData
?
– akrun
Nov 16 '18 at 18:10
Trymap(names(ListofDatalst), ~ str_sub(.x, 1, -5))
– akrun
Nov 16 '18 at 18:15
The problem is alapply
problem: it passesX[[1]]
, thenX[[2]]
, etc to the function. Putcat("namey:", namey, "n")
right afterdeparse/substitute
to see what is the df name in the function.
– Rui Barradas
Nov 16 '18 at 18:17
Anders Ellern Bilgrau : ListofData contains 300 data frames. Each dataframe has the same structure, same variables and the same "structure" for the name. akrun : the name of the file is the name of the object, because I import the .csv files as follows : temp = list.files(pattern="*.csv") ListofData = lapply(temp, read.csv)
– user163731
Nov 16 '18 at 18:19
4
4
Could you prove a minimal example of what
ListofData
contains?– Anders Ellern Bilgrau
Nov 16 '18 at 18:08
Could you prove a minimal example of what
ListofData
contains?– Anders Ellern Bilgrau
Nov 16 '18 at 18:08
Looks like it is the file name instead of the object name. I think you need to loop through the names of the
ListofData
?– akrun
Nov 16 '18 at 18:10
Looks like it is the file name instead of the object name. I think you need to loop through the names of the
ListofData
?– akrun
Nov 16 '18 at 18:10
Try
map(names(ListofDatalst), ~ str_sub(.x, 1, -5))
– akrun
Nov 16 '18 at 18:15
Try
map(names(ListofDatalst), ~ str_sub(.x, 1, -5))
– akrun
Nov 16 '18 at 18:15
The problem is a
lapply
problem: it passes X[[1]]
, then X[[2]]
, etc to the function. Put cat("namey:", namey, "n")
right after deparse/substitute
to see what is the df name in the function.– Rui Barradas
Nov 16 '18 at 18:17
The problem is a
lapply
problem: it passes X[[1]]
, then X[[2]]
, etc to the function. Put cat("namey:", namey, "n")
right after deparse/substitute
to see what is the df name in the function.– Rui Barradas
Nov 16 '18 at 18:17
Anders Ellern Bilgrau : ListofData contains 300 data frames. Each dataframe has the same structure, same variables and the same "structure" for the name. akrun : the name of the file is the name of the object, because I import the .csv files as follows : temp = list.files(pattern="*.csv") ListofData = lapply(temp, read.csv)
– user163731
Nov 16 '18 at 18:19
Anders Ellern Bilgrau : ListofData contains 300 data frames. Each dataframe has the same structure, same variables and the same "structure" for the name. akrun : the name of the file is the name of the object, because I import the .csv files as follows : temp = list.files(pattern="*.csv") ListofData = lapply(temp, read.csv)
– user163731
Nov 16 '18 at 18:19
|
show 1 more comment
1 Answer
1
active
oldest
votes
Import this way so you keep your names:
library(tidyverse)
ListofData <- map(set_names(temp), read_csv)
then we modify your function to add the name as a second parameter, which will be used through imap
, so we get rid of the first line too :
tagging <- function(H, namey){
namey<- str_sub(namey,1, -5) #drop the .csv
H$date<-substring(namey,1, 6) # get the first 6 characters containing the date
H$selection<- word(namey, -1) #get the last word
H$treatment<- word(namey, -2) # get the second last word
H$REP<- word(namey, -3) # get the third last word
return(H)
}
Then imap
passes the data to the H
argument and the element names to the namey
argument.
ListofData.tagged <- imap(ListofData, tagging)
base R translation
ListofData <- lapply(setNames(temp,temp), read.csv)
ListofData.tagged <- Map(tagging, ListofData, names(ListofData))
Or if you don't care about naming the elements of ListofData
you can do directly Map(tagging, ListofData, temp)
(still keeping the new definition of tagging
).
thanks @rui-barradas
– Moody_Mudskipper
Nov 16 '18 at 18:57
It works!!! Thank you so so so much!
– user163731
Nov 17 '18 at 14:08
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53343205%2ffunction-works-on-one-element-of-list-doesnt-work-on-full-list-r%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Import this way so you keep your names:
library(tidyverse)
ListofData <- map(set_names(temp), read_csv)
then we modify your function to add the name as a second parameter, which will be used through imap
, so we get rid of the first line too :
tagging <- function(H, namey){
namey<- str_sub(namey,1, -5) #drop the .csv
H$date<-substring(namey,1, 6) # get the first 6 characters containing the date
H$selection<- word(namey, -1) #get the last word
H$treatment<- word(namey, -2) # get the second last word
H$REP<- word(namey, -3) # get the third last word
return(H)
}
Then imap
passes the data to the H
argument and the element names to the namey
argument.
ListofData.tagged <- imap(ListofData, tagging)
base R translation
ListofData <- lapply(setNames(temp,temp), read.csv)
ListofData.tagged <- Map(tagging, ListofData, names(ListofData))
Or if you don't care about naming the elements of ListofData
you can do directly Map(tagging, ListofData, temp)
(still keeping the new definition of tagging
).
thanks @rui-barradas
– Moody_Mudskipper
Nov 16 '18 at 18:57
It works!!! Thank you so so so much!
– user163731
Nov 17 '18 at 14:08
add a comment |
Import this way so you keep your names:
library(tidyverse)
ListofData <- map(set_names(temp), read_csv)
then we modify your function to add the name as a second parameter, which will be used through imap
, so we get rid of the first line too :
tagging <- function(H, namey){
namey<- str_sub(namey,1, -5) #drop the .csv
H$date<-substring(namey,1, 6) # get the first 6 characters containing the date
H$selection<- word(namey, -1) #get the last word
H$treatment<- word(namey, -2) # get the second last word
H$REP<- word(namey, -3) # get the third last word
return(H)
}
Then imap
passes the data to the H
argument and the element names to the namey
argument.
ListofData.tagged <- imap(ListofData, tagging)
base R translation
ListofData <- lapply(setNames(temp,temp), read.csv)
ListofData.tagged <- Map(tagging, ListofData, names(ListofData))
Or if you don't care about naming the elements of ListofData
you can do directly Map(tagging, ListofData, temp)
(still keeping the new definition of tagging
).
thanks @rui-barradas
– Moody_Mudskipper
Nov 16 '18 at 18:57
It works!!! Thank you so so so much!
– user163731
Nov 17 '18 at 14:08
add a comment |
Import this way so you keep your names:
library(tidyverse)
ListofData <- map(set_names(temp), read_csv)
then we modify your function to add the name as a second parameter, which will be used through imap
, so we get rid of the first line too :
tagging <- function(H, namey){
namey<- str_sub(namey,1, -5) #drop the .csv
H$date<-substring(namey,1, 6) # get the first 6 characters containing the date
H$selection<- word(namey, -1) #get the last word
H$treatment<- word(namey, -2) # get the second last word
H$REP<- word(namey, -3) # get the third last word
return(H)
}
Then imap
passes the data to the H
argument and the element names to the namey
argument.
ListofData.tagged <- imap(ListofData, tagging)
base R translation
ListofData <- lapply(setNames(temp,temp), read.csv)
ListofData.tagged <- Map(tagging, ListofData, names(ListofData))
Or if you don't care about naming the elements of ListofData
you can do directly Map(tagging, ListofData, temp)
(still keeping the new definition of tagging
).
Import this way so you keep your names:
library(tidyverse)
ListofData <- map(set_names(temp), read_csv)
then we modify your function to add the name as a second parameter, which will be used through imap
, so we get rid of the first line too :
tagging <- function(H, namey){
namey<- str_sub(namey,1, -5) #drop the .csv
H$date<-substring(namey,1, 6) # get the first 6 characters containing the date
H$selection<- word(namey, -1) #get the last word
H$treatment<- word(namey, -2) # get the second last word
H$REP<- word(namey, -3) # get the third last word
return(H)
}
Then imap
passes the data to the H
argument and the element names to the namey
argument.
ListofData.tagged <- imap(ListofData, tagging)
base R translation
ListofData <- lapply(setNames(temp,temp), read.csv)
ListofData.tagged <- Map(tagging, ListofData, names(ListofData))
Or if you don't care about naming the elements of ListofData
you can do directly Map(tagging, ListofData, temp)
(still keeping the new definition of tagging
).
edited Nov 16 '18 at 18:55
Rui Barradas
18.3k51833
18.3k51833
answered Nov 16 '18 at 18:47
Moody_MudskipperMoody_Mudskipper
25k33673
25k33673
thanks @rui-barradas
– Moody_Mudskipper
Nov 16 '18 at 18:57
It works!!! Thank you so so so much!
– user163731
Nov 17 '18 at 14:08
add a comment |
thanks @rui-barradas
– Moody_Mudskipper
Nov 16 '18 at 18:57
It works!!! Thank you so so so much!
– user163731
Nov 17 '18 at 14:08
thanks @rui-barradas
– Moody_Mudskipper
Nov 16 '18 at 18:57
thanks @rui-barradas
– Moody_Mudskipper
Nov 16 '18 at 18:57
It works!!! Thank you so so so much!
– user163731
Nov 17 '18 at 14:08
It works!!! Thank you so so so much!
– user163731
Nov 17 '18 at 14:08
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53343205%2ffunction-works-on-one-element-of-list-doesnt-work-on-full-list-r%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
4
Could you prove a minimal example of what
ListofData
contains?– Anders Ellern Bilgrau
Nov 16 '18 at 18:08
Looks like it is the file name instead of the object name. I think you need to loop through the names of the
ListofData
?– akrun
Nov 16 '18 at 18:10
Try
map(names(ListofDatalst), ~ str_sub(.x, 1, -5))
– akrun
Nov 16 '18 at 18:15
The problem is a
lapply
problem: it passesX[[1]]
, thenX[[2]]
, etc to the function. Putcat("namey:", namey, "n")
right afterdeparse/substitute
to see what is the df name in the function.– Rui Barradas
Nov 16 '18 at 18:17
Anders Ellern Bilgrau : ListofData contains 300 data frames. Each dataframe has the same structure, same variables and the same "structure" for the name. akrun : the name of the file is the name of the object, because I import the .csv files as follows : temp = list.files(pattern="*.csv") ListofData = lapply(temp, read.csv)
– user163731
Nov 16 '18 at 18:19