Сделайте цикл с if, чтобы создать столбец [duplicate]

Здесь читайте это. Он даст вам общий обзор пакетов и импорта. Это поможет вам изучить структуру исходного файла java. Ваша структура неверна.

http://www.leepoint.net/notes-java/language/10basics/import.html

EDIT: Попробуйте это тоже. Это немного более «вовлечено», но имеет много хороших деталей:

http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/ Chapter05 / packagesImport.html

28
задан Assad Ebrahim 10 February 2014 в 11:29
поделиться

6 ответов

x <- seq(0.1,10,0.1)

> x
  [1]  0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9  1.0  1.1  1.2  1.3  1.4  1.5
 [16]  1.6  1.7  1.8  1.9  2.0  2.1  2.2  2.3  2.4  2.5  2.6  2.7  2.8  2.9  3.0
 [31]  3.1  3.2  3.3  3.4  3.5  3.6  3.7  3.8  3.9  4.0  4.1  4.2  4.3  4.4  4.5
 [46]  4.6  4.7  4.8  4.9  5.0  5.1  5.2  5.3  5.4  5.5  5.6  5.7  5.8  5.9  6.0
 [61]  6.1  6.2  6.3  6.4  6.5  6.6  6.7  6.8  6.9  7.0  7.1  7.2  7.3  7.4  7.5
 [76]  7.6  7.7  7.8  7.9  8.0  8.1  8.2  8.3  8.4  8.5  8.6  8.7  8.8  8.9  9.0
 [91]  9.1  9.2  9.3  9.4  9.5  9.6  9.7  9.8  9.9 10.0

> ifelse(x < 5, 1, 2)
  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [38] 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 [75] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
44
ответ дан Roman Luštrik 15 August 2018 в 19:12
поделиться
  • 1
    Это также очень полезно для замены только некоторых значений: например, x = ...; x[x < 5] = 1 - ifelse(x < 5, 1, x) – flying sheep 21 February 2015 в 18:23
  • 2
    Что делать, если я хочу вернуть элементы другого вектора? – skan 8 March 2017 в 14:38
  • 3
    @skan попробуйте y[x < 5]. Предполагая, что длины x и y идентичны – Roman Luštrik 8 March 2017 в 16:12
nzMean <- function(x) { mean(x[x!=-1],na.rm=TRUE)}

nzMin <- function(x) {min(x[x!=-1],na.rm=TRUE)}

nzMax <- function(x) { max(x[x!=-1],na.rm=TRUE)}

nzRange<-function(x) {nzMax(x)-nzMin(x)}

nzSD <- function(x) { SD(x[x!=-1],na.rm=TRUE)}

#following function works
nzN1<- function(x) {ifelse(x!=-1,(x-nzMin(x))/nzRange(x) ,x) }

#following is bad as it returns only 4 not 5 elements of vector
nzN2<- function(x) {ifelse(x!=-1,(x[x!=-1]-nzMin(x))/nzRange(x) ,x) }

#following is bad as it returns 5 elements of vector but not correct answer
nzN3<- function(x) {ifelse(x!=-1,(x[x!=-1]-nzMin(x))/nzRange(x) ,-1) }

y<-c(1,-1,-20,2,4)
a<-nzMean(y)
b<-nzMin(y)
c<-nzMax(y)
d<-nzRange(y)
# test the working function
z<-nzN1(y)

print(z)
0
ответ дан Arun 15 August 2018 в 19:12
поделиться

Вы также можете просто создать логический вектор и 1 к нему

x <- seq(0.1, 10, 0.1) # Your data set   
(x >= 5) + 1
#  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
# [92] 2 2 2 2 2 2 2 2 2

. Если бы вы хотели сравнить производительность, это было бы самым быстрым решением

set.seed(100)
x <- runif(1e6, 1, 10)

RL <- function(x) y <- ifelse(x < 5,1,2)
JM <- function(x) {y <- rep(2, length(x)); y[x < 5] <- 1}
DA <- function(x) y <- (x >= 5) + 1

library(microbenchmark)
microbenchmark(RL(x),
               JM(x),
               DA(x))

# Unit: milliseconds
#  expr       min        lq      mean    median        uq       max neval
# RL(x) 331.83448 366.52940 378.89182 374.99741 381.08659 609.21218   100
# JM(x)  38.72894  42.18745  44.36493  43.25086  44.09626  82.76168   100
# DA(x)  10.01644  11.96482  14.21593  13.17825  14.12930  53.76923   100
1
ответ дан David Arenburg 15 August 2018 в 19:12
поделиться
  • 1
    Для более эффективного подхода слегка вы можете изменить свой код на function(x) y <- (x >= 5L) + 1L, но, как правило, хороший ответ и интересно посмотреть, насколько медленным, в сравнении, ifelse. – docendo discimus 30 December 2014 в 15:21

Следуя вышеприведенному сообщению, вы можете даже использовать и изменять элементы вектора, удовлетворяющего критериям. На мой взгляд, если это не так дорого вычислять быстрее, всегда нужно это делать.

x = seq(0.1,10,0.1)
y <- rep(2,length(x))
y[x<5] <- x[x<5]*2

Код предыдущего сообщения лучше всего ответить на вопрос. Но если бы мне пришлось использовать код выше, я бы сделал:

x = seq(0.1,10,0.1)
y <- rep(2,length(x))
y[x<5] <- x[x<5]*0 +1
0
ответ дан DJJ 15 August 2018 в 19:12
поделиться
  • 1
    Ответы могут перемещаться вверх или вниз в зависимости от голосов, относящихся к «вышеупомянутой записи». может быть хлопотно. – Johan Larsson 31 August 2016 в 17:40

Для полноты: в больших векторах вы можете использовать индексы для ускорения работы (мы часто это делаем в симуляциях, где функции обычно выполняются от 1000 до 10000 раз). Но пока это не нужно, просто используйте ifelse. Это читается намного проще.

> set.seed(100)
> x <- runif(1000,1,10)

> system.time(replicate(10000,{
+     y <- ifelse(x < 5,1,2)
+ }))
   user  system elapsed 
   2.56    0.08    2.64 

> system.time(replicate(10000,{
+   y <- rep(2,length(x))
+   y[x < 5]<- 1
+ }))
   user  system elapsed 
   0.48    0.00    0.48 
11
ответ дан Joris Meys 15 August 2018 в 19:12
поделиться
  • 1
    Вы можете сократить это время еще больше. Моя машина выполнила второй метод в 0.436 (хотя он был медленнее первого метода), но это улучшило его еще на 200%: system.time (replicate (10000, {y & lt; - (y & lt; 5) + 2 * ! (y & lt; 5)})) пользовательская система прошла 0.101 0.021 0.128 – 42- 31 October 2010 в 05:31
  • 2
    @Dwin: Очень приятное решение! спасибо. Но на моей машине он работает только немного быстрее (0,47 по сравнению с 0,48) – Joris Meys 31 October 2010 в 20:59
  • 3
    Осторожно - ваши два примера не эквивалентны, если x содержит элементы NA (которые будут оставаться NA в первом, но будут назначены 1 для второго). – jbaums 13 July 2014 в 10:31
  • 4
    @jbaums Это правильно. Добавление дополнительной строки y [is.na (x)] & lt; - NA все еще сохраняет это решение на 2-й раз быстрее, чем ifelse () – Joris Meys 14 July 2014 в 11:23

y <- if (x < 5) 1 else 2 не работает на весь вектор (предупреждение, которое вы получаете, указывает, что будет использоваться только первый элемент условия). Вы хотите ifelse:

y <- ifelse(x < 5, 1, 2)

ifelse работает по всему логическому вектору, поэтапно. if принимает только одно логическое значение. См. ?"if" и ?ifelse

11
ответ дан Joshua Ulrich 15 August 2018 в 19:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: