每当我想在R中做一些"map"py时,我通常会尝试使用一个函数 apply家族中.
但是,我从来没有完全理解它们之间的区别 - 如何{ sapply,lapply等}将函数应用于输入/分组输入,输出将是什么样的,甚至输入可以是什么 - 所以我经常只要仔细检查它们,直到我得到我想要的东西.
有人可以解释如何使用哪一个?
我当前(可能不正确/不完整)的理解是......
sapply(vec, f):输入是一个向量.output是一个向量/矩阵,其中element i是f(vec[i])一个矩阵,如果f有一个多元素输出
lapply(vec, f):相同sapply,但输出是一个列表?
apply(matrix, 1/2, f):输入是一个矩阵.output是一个向量,其中element i是f(矩阵的row/col i)tapply(vector, grouping, f):output是一个矩阵/数组,其中矩阵/数组中的元素是向量f分组g的值,和g被推送到行/列名称by(dataframe, grouping, f):让我们g成为一个分组.适用f于组/数据框的每一列.漂亮打印分组和f每列的值.aggregate(matrix, grouping, f):类似于by,但不是将输出打印得很漂亮,而是将所有内容都粘贴到数据帧中.侧问题:我还没有学会plyr或重塑-将plyr或reshape更换所有这些完全?
我在使用data.table时遇到问题:如何转换列类?这是一个简单的例子:使用data.frame我没有转换它的问题,data.table我只是不知道如何:
df <- data.frame(ID=c(rep("A", 5), rep("B",5)), Quarter=c(1:5, 1:5), value=rnorm(10))
#One way: http://stackoverflow.com/questions/2851015/r-convert-data-frame-columns-from-factors-to-characters
df <- data.frame(lapply(df, as.character), stringsAsFactors=FALSE)
#Another way
df[, "value"] <- as.numeric(df[, "value"])
library(data.table)
dt <- data.table(ID=c(rep("A", 5), rep("B",5)), Quarter=c(1:5, 1:5), value=rnorm(10))
dt <- data.table(lapply(dt, as.character), stringsAsFactors=FALSE)
#Error in rep("", ncol(xi)) : invalid 'times' argument
#Produces error, does data.table not have the option stringsAsFactors?
dt[, "ID", with=FALSE] <- as.character(dt[, "ID", with=FALSE])
#Produces error: Error in `[<-.data.table`(`*tmp*`, , "ID", with = FALSE, value = "c(1, 1, 1, 1, 1, 2, …Run Code Online (Sandbox Code Playgroud) 我有一个大型数据框(14552行乘15列),包含2001年至2007年的计费数据.我使用sqlFetch获取2008年的数据.为了将2008年数据附加到前7年的数据,可以如下进行
alltime <- rbind(alltime,all2008)
不幸的是,生成
警告消息:In
alltime <- rbind(alltime,all2008)(alltime <- rbind(alltime,all2008),ri,value = c(NA,NA,NA,NA,NA,NA,NA,:无效因子级别,生成的NAs)
我的猜测是,有一些新病人的名字不在之前的数据框中,因此不知道给它的级别.类似于推荐医生专栏中新的看不见的名字.
R导入数据并自动计算出数字和非数据的方式(从而使其成为一个因素)很棒 - 直到你必须进一步操纵它然后它变得很痛苦.我如何优雅地克服我的问题?
我有一个函数,我在其中定义一个data.frame我使用循环来填充数据.在某些时候,我收到警告消息:
警告消息:1:In
[<-.factor(*tmp*,iseq,value ="CHANGE"):生成的因子级别无效
因此,当我定义我的data.frame时,我想将选项设置stringsAsFactors为FALSE但我不明白该怎么做.
我试过了:
DataFrame = data.frame(stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)
并且:
options(stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)
设置stringsAsFactors选项的正确方法是什么?
我一直在尝试删除数据框中的空白区域(使用R).数据框很大(> 1gb),并且有多个列,每个数据条目中都包含空格.
有没有快速的方法从整个数据框中删除空白?我一直在尝试使用以下方法对前10行数据的子集执行此操作:
gsub( " ", "", mydata)
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用,虽然R返回了我无法解释的输出.
str_replace( " ", "", mydata)
Run Code Online (Sandbox Code Playgroud)
R返回了47个警告并且没有移除空白区域.
erase_all(mydata, " ")
Run Code Online (Sandbox Code Playgroud)
R返回错误,说"错误:找不到功能"erase_all"'
我真的很感激一些帮助,因为我花了最后24小时试图解决这个问题.
谢谢!
我有一个包含事件历史记录的数据框,我想通过检查每个ID号的最后一个事件是否与系统中该ID号的当前值匹配来检查其完整性.数据被编码为因子.以下玩具数据框是一个最小的例子:
df <-data.frame(ID=c(1,1,1,1,2,2,2,3,3),
current.grade=as.factor(c("Senior","Senior","Senior","Senior",
"Junior","Junior","Junior",
"Sophomore","Sophomore")),
grade.history=as.factor(c("Freshman","Sophomore","Junior","Senior",
"Freshman","Sophomore","Junior",
"Freshman","Sophomore")))
Run Code Online (Sandbox Code Playgroud)
它给出了输出
> df
ID current.grade grade.history
1 1 Senior Freshman
2 1 Senior Sophomore
3 1 Senior Junior
4 1 Senior Senior
5 2 Junior Freshman
6 2 Junior Sophomore
7 2 Junior Junior
8 3 Sophomore Freshman
9 3 Sophomore Sophomore
> str(df)
'data.frame': 9 obs. of 3 variables:
$ ID : num 1 1 1 1 2 2 2 3 3
$ current.grade: Factor w/ 3 levels "Junior","Senior",..: 2 …Run Code Online (Sandbox Code Playgroud) 我有许多CSV文件,其中包含性别,年龄,诊断等列.
目前,它们的编码如下:
ID, gender, age, diagnosis
1, male, 42, asthma
1, male, 42, anxiety
2, male, 19, asthma
3, female, 23, diabetes
4, female, 61, diabetes
4, female, 61, copd
Run Code Online (Sandbox Code Playgroud)
目标是将此数据转换为此目标格式:
旁注:如果可能的话,还可以将原始列名称添加到新列名称中,例如"age_42"或"gender_female".
ID, male, female, 42, 19, 23, 61, asthma, anxiety, diabetes, copd
1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0
2, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0
3, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0
4, 0, …Run Code Online (Sandbox Code Playgroud) 我有一个因素instrumentF:
> instrumentF
[1] Guitar Drums Cello Harp
Levels: Cello Drums Guitar Harp
Run Code Online (Sandbox Code Playgroud)
假设我使用[].
> level2 = instrumentF[1]
> level2
[1] Guitar
Levels: Cello Drums Guitar Harp
Run Code Online (Sandbox Code Playgroud)
如何Guitar从因子对象中获取因子标签level2?
level2$level 似乎不起作用:
> Error in level2$level : $ operator is invalid for atomic vectors
Run Code Online (Sandbox Code Playgroud) 我正在尝试将所有在将 csv 导入字符时显示为逻辑的列转换为字符。
如果我调用每一列,这些代码如下所示,但我有 200 多列,所以它不可行。
library(stringi)
library(readr)
library(dplyr)
df <- read_csv("~/dataverified.csv",
col_types = cols(
Innovation = col_character(),
Tech = col_character(),
Music = col_character()))
Run Code Online (Sandbox Code Playgroud)
这是一列的摘要 () 示例,下面是期望的输出
例如输入摘要
Innovation
Mode:logical
TRUE:403
NA's 45600
Run Code Online (Sandbox Code Playgroud)
例如,每列的欲望输出摘要
Innovation
Length: 45900
Class:character
Mode:character
Run Code Online (Sandbox Code Playgroud) 我有一个大的数据集df(354903行)与名为两列df$ColumnName和df$ColumnName.1
head(df)
CompleteName CompleteName.1
1 Lefebvre Arnaud Lefebvre Schuhl Anne
1.1 Lefebvre Arnaud Abe Lyu
1.2 Lefebvre Arnaud Abe Lyu
1.3 Lefebvre Arnaud Louvet Nicolas
1.4 Lefebvre Arnaud Muller Jean Michel
1.5 Lefebvre Arnaud De Dinechin Florent
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建标签以查看天气名称是否相同。当我尝试一个小的子集时,它可以工作[如果它们相同则为1,否则为0]:
> match(df$CompleteName[1], df$CompleteName.1[1], nomatch = 0)
[1] 0
> match(df$CompleteName[1:10], df$CompleteName.1[1:10], nomatch = 0)
[1] 0 0 0 0 0 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
但是,一旦我抛出完整的列,它就会为我提供完整的不同值,这对我来说似乎毫无意义:
> match(df$CompleteName, df$CompleteName.1, nomatch = 0)
[1] 101 101 101 101 …Run Code Online (Sandbox Code Playgroud) 我希望对两列进行排序并将其粘贴到新列中。
test = data.frame('a'='jump','b'='jam')
test %>% mutate(new=paste(sort(a,b)))
Run Code Online (Sandbox Code Playgroud)
预期输出是包含三列的数据框:
'a'='jump','b'='jam','c'='jamjump'
Run Code Online (Sandbox Code Playgroud) 我只是不明白为什么我的数据框仍然是一个因素,即使我尝试将其更改为一个字符.
这里我有一个数据框list_attribute$affrete.
affrete
<chr>
Fruits
Apple
Grape Fruits
Lemon
Peach
Banana
Orange
Strawberry
Apple
Run Code Online (Sandbox Code Playgroud)
我应用了一个函数,list_attribute$affrete使用另一个数据框将一些值替换为其他值renaming,该数据框有两列(Name和Rename).
affrete <- plyr::mapvalues(x = unlist(list_attribute$affrete, use.names = F),
from = as.character(renaming$Name),
to = as.character(renaming$Rename))
affrete <- as.character(affrete)
list_attribute$affrete <- data.frame(affrete)
Run Code Online (Sandbox Code Playgroud)
数据框renaming看起来像这样;
Name Rename
<fctr> <fctr>
Apple Manzana
Orange Naranja
Lemon Limon
Grape Uva
Peach Melocoton
Pinapple Anana
Run Code Online (Sandbox Code Playgroud)
这是list_attribute$affrete在应用上述这些过程之后.
affrete
<fctr>
Manzana
Grape Fruits
Limon
Melocoton
Banana
Naranja
Strawberry
Manzana
Run Code Online (Sandbox Code Playgroud)