我正在尝试使用 PCA 来选择一些 K 主要组件来使用。
我知道不应在测试集上重新运行 PCA,而应使用在对训练集建模时找到的特征向量 \ PC。
我有 2 个 CSV - 一个是训练集,
另一个测试集(每条记录没有标签)
训练集上的 PCA 过程使用以下代码完成:
# Load CSV file
train_set.init_data <- read.csv("D:\\train.csv", header = TRUE)
# Remove identifier and respone variables (ID, and SalePrice):
train_set.vars <- subset(train_set.init_data, select = -c(Id, SalePrice))
# Convert catergorical variables into numerical using dummy variables:
library(dummies)
train_set.vars_dummy <- dummy.data.frame(train_set.vars, sep = ".")
# Principal Component Analysis:
train_set.prin_comp <- prcomp(train_set.vars_dummy, scale. = T)
# Choose some K components
????
# Run …Run Code Online (Sandbox Code Playgroud) 我想知道如何告诉R只显示每行中的最大值.
例如,我想要这张表:
> data<- randu
> data[1:10,]
x y z
1 0.000031 0.000183 0.000824
2 0.044495 0.155732 0.533939
3 0.822440 0.873416 0.838542
4 0.322291 0.648545 0.990648
5 0.393595 0.826873 0.418881
6 0.309097 0.926590 0.777664
7 0.826368 0.308540 0.413932
8 0.729424 0.741526 0.884338
9 0.317649 0.393468 0.501968
10 0.599793 0.846041 0.678107
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
x y z
1 0.000824
2 0.533939
3 0.873416
4 0.990648
5 0.826873
6 0.926590
7 0.826368
8 0.884338
9 0.501968
10 0.846041
Run Code Online (Sandbox Code Playgroud) x <- seq(1:100)
y <- 30
Run Code Online (Sandbox Code Playgroud)
如果我想确定x> y的累积和的位置
which.max(cumsum(x) >= y)
[1] 9 #
Run Code Online (Sandbox Code Playgroud)
相反,如果y是一个向量,即我想为y的每个元素返回x的位置
y <- c(30, 60, 80, 90)
which.max(cumsum(x) >= y)
[1] 9
Run Code Online (Sandbox Code Playgroud)
为什么不重新调整位置向量?
它需要(在我的MBP上使用2.9 GHz Intel Core i7和16 GB内存)超过20秒才能获得40,000 x 1,000矩阵的交叉产品:
> system.time(a <- crossprod(matrix(pi,40000,1000)))
user system elapsed
23.808 0.139 24.001
Run Code Online (Sandbox Code Playgroud)
有没有办法让它更快?谢谢你的帮助.
我有list2个或更多dataframes:
d <- data.frame(x=1:3, y=letters[1:3])
f <- data.frame(x=11:13, y=letters[11:13])
df <- list(d, f)
Run Code Online (Sandbox Code Playgroud)
为了保存它们.csv,我使用以下语法:
filenames = paste0('C:/Output_', names(df), '.csv')
Map(write.csv, df, filenames)
Run Code Online (Sandbox Code Playgroud)
但是我想添加一些字符串来获取特定的格式,例如:
quote = FALSE, row.names = FALSE, sep = "\t", na = "", col.names = FALSE
Run Code Online (Sandbox Code Playgroud)
问题是我不确定在哪里添加该语法.无论我在哪里尝试,我都会warning说我的语法被忽略了.
> Warning messages:
1: In (function (...) : attempt to set 'col.names' ignored
2: In (function (...) : attempt to set 'sep' ignored
3: In (function (...) : attempt to set 'col.names' ignored …Run Code Online (Sandbox Code Playgroud) 对R来说相当新.我想要做的是将矩阵中的所有数字都说成5,低于5.例如,如果矩阵是这样的:
1 3 2 5 7
3 8 3 6 2
Run Code Online (Sandbox Code Playgroud)
我想进入:
1 3 2 5 5
3 5 3 5 2
Run Code Online (Sandbox Code Playgroud)
我觉得必须有一种更有效的方法,而不是每次都用手做.任何帮助,将不胜感激.
如果我有此数据框:
df <- data.frame(time = seq(as.Date('2000-01-01'), length.out = 200, by = 'days'),
a = rnorm(200,8.4, 22), b=rnorm(200,8.4, 22), d= rnorm(200,8.4, 22),
e=rnorm(200,8.4, 22))
Run Code Online (Sandbox Code Playgroud)
子集化最简单的方法是什么,df以便每列的值都应大于百分之十,而小于百分之九十?
我可以使用循环来做到这一点,即:
for (i in names(df[,2:5])){
print(i)
column <- df[,c('time', i)]
q <- unname(quantile(column[,2], probs = c(0.1, 0.9))) # just for one column
column <- column[column[,2] > q[1] &column[,2] < q[2],]
df <- merge(df, column, by = 'time', all.x = T)
}
Run Code Online (Sandbox Code Playgroud)
但是有更简单更优雅的方式使用函数或包这样做dplyr。谢谢!
我有一个数据框,可以过滤,删除和添加一些列,然后我想使用管道(%>%)重命名所有列。
但是,我不明白如何获取当前的colnames向量(在内%>%)并将其替换为另一个向量?如果我不删除列,这似乎很简单,但是如何“更新” colnames管道链中的向量?
library(dplyr)
library(tidyr)
data("mtcars")
mtcars %>%
filter(disp < 200) %>%
dplyr::select(-c('mpg','cyl', "disp")) %>%
mutate(Type = 2) %>%
# rename_at(vars(names(df), # how to rename the columns???
# function(x) paste(names(df), "new", sep = "_"))) %>%
head(2)
Run Code Online (Sandbox Code Playgroud)
我得到的是:
hp drat wt qsec vs am gear carb Type
1 110 3.9 2.620 16.46 0 1 4 4 2
2 110 3.9 2.875 17.02 0 1 4 4 2
Run Code Online (Sandbox Code Playgroud)
我期望什么(更改姓氏)
hp_new drat_new wt_new qsec_new vs_new am_new gear_new carb_new …Run Code Online (Sandbox Code Playgroud) 我在R中相当多地使用了Any和All函数,但是我想要一些灵活性。是否有任何函数可以告诉我一定百分比的值是对还是假?
df
x
1 5
2 5
3 5
4 4
5 3
6 5
7 5
8 5
9 5
10 5
all(df$x==5)
[1] FALSE
any(df$x==5)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
所需的输出
伪码
60% of df == 5
TRUE
90% of df == 5
FALSE
Run Code Online (Sandbox Code Playgroud) 我有一个包含很多行和列的大型数据框。在一列中有字符,其中一些只出现一次,另一些则出现多次。我现在想分离整个数据框,这样我最终会得到两个数据框,一个是所有行的字符在这一列中重复,另一个是所有行的字符只出现一次. 例如:
One = c(1,2,3,4,5,6,7,8,9,10)
Two = c(4,5,3,6,2,7,1,8,1,9)
Three = c("a", "b", "c", "d","d","e","f","e","g","c")
df <- data.frame(One, Two, Three)
> df
One Two Three
1 1 4 a
2 2 5 b
3 3 3 c
4 4 6 d
5 5 2 d
6 6 7 e
7 7 1 f
8 8 8 e
9 9 1 g
10 10 9 c
Run Code Online (Sandbox Code Playgroud)
我希望有两个数据框,比如
> dfSingle
One Two Three
1 1 4 a
2 2 5 b
7 7 …Run Code Online (Sandbox Code Playgroud)