1669380739
When you’re inspecting JavaScript code, you may find an expression using a double question mark (??
) as in the code below:
alert(username ?? "Guest");
The double question mark operator is called the nullish coalescing operator, and it’s a new feature of JavaScript ES2020 that allows you provide a default value to use when a variable expression evaluates to null
or undefined
.
The nullish coalescing operator simply returns the expression on the right-side of the mark when the expression on the left side is null
or undefined
.
For example, the following code will assign the firstName
variable value as the value of username
variable. When the firstName
value is null, the username
will be assigned as "Guest"
:
let firstName = null;
let username = firstName ?? "Guest";
console.log(username); // "Guest"
Or you can also write it this way:
let username = undefined ?? "Guest";
console.log(username); // "Guest"
Unlike the JavaScript operator OR (||
) the nullish coalescing operator won’t replace false
values with the right-side expression. One example of this is when you pass an empty string (""
) as the left side expression.
JavaScript evaluates an empty string to false
as in the code below:
let firstName = ""; // empty string evaluates to false in JavaScript
let username = firstName ?? "Guest";
console.log(username); // ""
The nullish coalescing operator was created because there will be times when you want to consider falsy values like 0
and empty string ""
to be valid values. The use of OR operator will prevent you from returning any falsy values.
By using the nullish coalescing operator, you will only replace exactly null
and undefined
values with a defined value.
For safety reasons, the double question mark can’t be used together with JavaScript OR (||
) and AND (&&
) operators without a parentheses ()
separating the operators.
For example, the following code tries to see if either firstName
or lastName
variable can be used as the value of username
before using "Guest"
as its value:
let firstName = "John";
let lastName = "Stone";
let username = firstName || lastName ?? "Guest"; // Error: Unexpected token '??'
console.log(username);
This is because JavaScript won’t be able to determine which operator it needs to evaluate first. You need to use parentheses to clearly indicate the priority of the evaluations.
The following code will first evaluate the expressions inside the parentheses:
let firstName = null;
let lastName = undefined;
let username = (firstName || lastName) ?? "Guest";
console.log(username); // "Guest"
And that’s how you combine the nullish coalescing operator with either AND or OR operator.
The JavaScript double question mark is also known as the nullish coalescing operator. It’s an operator that simply returns the right-side expression when the left side expression is either null
or undefined
.
Unlike the OR operator, the nullish coalescing operator is a situational operator that allows you to return 0
and empty string ""
as a valid value for your application.
Don’t forget to use parentheses when you combine it with AND / OR operator 😉
Original article source at: https://sebhastian.com/
1669188856
In this R article, we will learn about What Is R Programming Language? introduction & Basics. R is a programming language developed by Ross Ihaka and Robert Gentleman in 1993. R possesses an extensive catalog of statistical and graphical methods. It includes machine learning algorithms, linear regression, time series, statistical inference to name a few. Most of the R libraries are written in R, but for heavy computational tasks, C, C++, and Fortran codes are preferred.
Data analysis with R is done in a series of steps; programming, transforming, discovering, modeling and communicating the results
As conclusion, R is the world’s most widely used statistics programming language. It’s the 1st choice of data scientists and supported by a vibrant and talented community of contributors. R is taught in universities and deployed in mission-critical business applications.
Windows Installation – We can download the Windows installer version of R from R-3.2.2 for windows (32/64)
As it is a Windows installer (.exe) with the name “R-version-win.exe”. You can just double click and run the installer accepting the default settings. If your Windows is a 32-bit version, it installs the 32-bit version. But if your windows are 64-bit, then it installs both the 32-bit and 64-bit versions.
After installation, you can locate the icon to run the program in a directory structure “R\R3.2.2\bin\i386\Rgui.exe” under the Windows Program Files. Clicking this icon brings up the R-GUI which is the R console to do R Programming.
R Programming is a very popular programming language that is broadly used in data analysis. The way in which we define its code is quite simple. The “Hello World!” is the basic program for all the languages, and now we will understand the syntax of R programming with the “Hello world” program. We can write our code either in the command prompt, or we can use an R script file.
Once you have R environment setup, then it’s easy to start your R command prompt by just typing the following command at your command prompt −
$R
This will launch R interpreter and you will get a prompt > where you can start typing your program as follows −
>myString <- "Hello, World"
>print (myString)
[1] "Hello, World!"
Here the first statement defines a string variable myString, where we assign a string “Hello, World!” and then the next statement print() is being used to print the value stored in myString variable.
While doing programming in any programming language, you need to use various variables to store various information. Variables are nothing but reserved memory locations to store values. This means that when you create a variable you reserve some space in memory.
In contrast to other programming languages like C and java in R, the variables are not declared as some data type. The variables are assigned with R-Objects and the data type of the R-object becomes the data type of the variable. There are many types of R-objects. The frequently used ones are −
#create a vector and find the elements which are >5
v<-c(1,2,3,4,5,6,5,8)
v[v>5]
#subset
subset(v,v>5)
#position in the vector created in which square of the numbers of v is >10 holds good
which(v*v>10)
#to know the values
v[v*v>10]
Output: [1] 6 8
Output: [1] 6 8
Output: [1] 4 5 6 7 8
Output: [1] 4 5 6 5 8
A matrix is a two-dimensional rectangular data set. It can be created using a vector input to the matrix function.
#matrices: a vector with two dimensional attributes
mat<-matrix(c(1,2,3,4))
mat1<-matrix(c(1,2,3,4),nrow=2)
mat1
Output: [,1] [,2] [1,] 1 3 [2,] 2 4
mat2<-matrix(c(1,2,3,4),ncol=2,byrow=T)
mat2
Output: [,1] [,2] [1,] 1 2 [2,] 3 4
mat3<-matrix(c(1,2,3,4),byrow=T)
mat3
#transpose of matrix
mattrans<-t(mat)
mattrans
#create a character matrix called fruits with elements apple, orange, pear, grapes
fruits<-matrix(c("apple","orange","pear","grapes"),2)
#create 3×4 matrix of marks obtained in each quarterly exams for 4 different subjects
X<-matrix(c(50,70,40,90,60, 80,50, 90,100, 50,30, 70),nrow=3)
X
#give row names and column names
rownames(X)<-paste(prefix="Test.",1:3)
subs<-c("Maths", "English", "Science", "History")
colnames(X)<-subs
X
Output: [,1] [1,] 1 [2,] 2 [3,] 3 [4,] 4 Output: [,1] [,2] [,3] [,4] [1,] 1 2 3 4 Output: [,1] [,2] [,3] [,4] [1,] 50 90 50 50 [2,] 70 60 90 30 [3,] 40 80 100 70 Output: Maths English Science History Test. 1 50 90 50 50 Test. 2 70 60 90 30 Test. 3 40 80 100 70
While matrices are confined to two dimensions, arrays can be of any number of dimensions. The array function takes a dim attribute which creates the required number of dimensions. In the below example we create an array with two elements which are 3×3 matrices each.
#Arrays
arr<-array(1:24,dim=c(3,4,2))
arr
#create an array using alphabets with dimensions 3 rows, 2 columns and 3 arrays
arr1<-array(letters[1:18],dim=c(3,2,3))
#select only 1st two matrix of an array
arr1[,,c(1:2)]
#LIST
X<-list(u=2, n='abc')
X
X$u
[,1] [,2] [,3] [,4]
[,1] [,2] [,3] [,4]
[,1] [,2]
[,1] [,2]
Data frames are tabular data objects. Unlike a matrix in a data frame, each column can contain different modes of data. The first column can be numeric while the second column can be character and the third column can be logical. It is a list of vectors of equal length.
#Dataframes
students<-c("J","L","M","K","I","F","R","S")
Subjects<-rep(c("science","maths"),each=2)
marks<-c(55,70,66,85,88,90,56,78)
data<-data.frame(students,Subjects,marks)
#Accessing dataframes
data[[1]]
data$Subjects
data[,1]
Output: [1] J L M K I F R S Levels: F I J K L M R S Output: data$Subjects [1] science science maths maths science science maths maths Levels: maths science
Factors are the r-objects which are created using a vector. It stores the vector along with the distinct values of the elements in the vector as labels. The labels are always character irrespective of whether it is numeric or character or Boolean etc. in the input vector. They are useful in statistical modeling.
Factors are created using the factor() function. The nlevels function gives the count of levels.
#Factors
x<-c(1,2,3)
factor(x)
#apply function
data1<-data.frame(age=c(55,34,42,66,77),bmi=c(26,25,21,30,22))
d<-apply(data1,2,mean)
d
#create two vectors age and gender and find mean age with respect to gender
age<-c(33,34,55,54)
gender<-factor(c("m","f","m","f"))
tapply(age,gender,mean)
Output: [1] 1 2 3 Levels: 1 2 3 Output: age bmi 54.8 24.8 Output: f m 44 44
A variable provides us with named storage that our programs can manipulate. A variable in R can store an atomic vector, a group of atomic vectors, or a combination of many R objects. A valid variable name consists of letters, numbers, and the dot or underlines characters.
total, sum, .fine.with.dot, this_is_acceptable, Number5
tot@l, 5um, _fine, TRUE, .0ne
Earlier versions of R used underscore (_) as an assignment operator. So, the period (.) was used extensively in variable names having multiple words. Current versions of R support underscore as a valid identifier but it is good practice to use a period as word separators.
For example, a.variable.name is preferred over a_variable_name or alternatively we could use camel case as aVariableName.
Constants, as the name suggests, are entities whose value cannot be altered. Basic types of constant are numeric constants and character constants.
Numeric Constants
All numbers fall under this category. They can be of type integer, double or complex. It can be checked with the typeof() function.
Numeric Constants followed by L are regarded as integers and those followed by i are regarded as complex.
> typeof(5)
> typeof(5L)
> typeof(5L)
[1] “double” [1] “double” [[1] “double”
Character Constants
Character constants can be represented using either single quotes (‘) or double quotes (“) as delimiters.
> 'example'
> typeof("5")
[1] "example" [1] "character"
Operators – Arithmetic, Relational, Logical, Assignment, and some of the Miscellaneous Operators that R programming language provides.
There are four main categories of Operators in the R programming language.
x <- 35
y<-10
x+y > x-y > x*y > x/y > x%/%y > x%%y > x^y [1] 45 [1] 25 [1] 350 [1] 3.5 [1] 3 [1] 5 [1]2.75e+15
The below table shows the logical operators in R. Operators & and | perform element-wise operation producing result having a length of the longer operand. But && and || examines only the first element of the operands resulting in a single length logical vector.
a <- c(TRUE,TRUE,FALSE,0,6,7)
b <- c(FALSE,TRUE,FALSE,TRUE,TRUE,TRUE)
a&b
[1] FALSE TRUE FALSE FALSE TRUE TRUE
a&&b
[1] FALSE
> a|b
[1] TRUE TRUE FALSE TRUE TRUE TRUE
> a||b
[1] TRUE
> !a
[1] FALSE FALSE TRUE TRUE FALSE FALSE
> !b
[1] TRUE FALSE TRUE FALSE FALSE FALSE
Functions are defined using the function() directive and are stored as R objects just like anything else. In particular, they are R objects of class “function”. Here’s a simple function that takes no arguments simply prints ‘Hi statistics’.
#define the function
f <- function() {
print("Hi statistics!!!")
}
#Call the function
f()
Output: [1] "Hi statistics!!!"
Now let’s define a function called standardize, and the function has a single argument x which is used in the body of a function.
#Define the function that will calculate standardized score.
standardize = function(x) {
m = mean(x)
sd = sd(x)
result = (x – m) / sd
result
}
input<- c(40:50) #Take input for what we want to calculate a standardized score.
standardize(input) #Call the function
Output: standardize(input) #Call the function [1] -1.5075567 -1.2060454 -0.9045340 -0.6030227 -0.3015113 0.0000000 0.3015113 0.6030227 0.9045340 1.2060454 1.5075567
R has some very useful functions which implement looping in a compact form to make life easier. The very rich and powerful family of applied functions is made of intrinsically vectorized functions. These functions in R allow you to apply some function to a series of objects (eg. vectors, matrices, data frames, or files). They include:
There is another function called split() which is also useful, particularly in conjunction with lapply.
A vector is a sequence of data elements of the same basic type. Members in a vector are officially called components. Vectors are the most basic R data objects and there are six types of atomic vectors. They are logical, integer, double, complex, character, and raw.
The c() function can be used to create vectors of objects by concatenating things together.
x <- c(1,2,3,4,5) #double
x #If you use only x auto-printing occurs
l <- c(TRUE, FALSE) #logical
l <- c(T, F) ## logical
c <- c("a", "b", "c", "d") ## character
i <- 1:20 ## integer
cm <- c(2+2i, 3+3i) ## complex
print(l)
print(c)
print(i)
print(cm)
You can see the type of each vector using typeof() function in R.
typeof(x)
typeof(l)
typeof(c)
typeof(i)
typeof(cm)
Output: print(l) [1] TRUE FALSE print(c) [1] "a" "b" "c" "d" print(i) [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 print(cm) [1] 2+2i 3+3i Output: typeof(x) [1] "double" typeof(l) [1] "logical" typeof(c) [1] "character" typeof(i) [1] "integer" typeof(cm) [1] "complex"
We can use the seq() function to create a vector within an interval by specifying step size or specifying the length of the vector.
seq(1:10) #By default it will be incremented by 1
seq(1, 20, length.out=5) # specify length of the vector
seq(1, 20, by=2) # specify step size
Output: > seq(1:10) #By default it will be incremented by 1 [1] 1 2 3 4 5 6 7 8 9 10 > seq(1, 20, length.out=5) # specify length of the vector [1] 1.00 5.75 10.50 15.25 20.00 > seq(1, 20, by=2) # specify step size [1] 1 3 5 7 9 11 13 15 17 19
Elements of a vector can be accessed using indexing. The vector indexing can be logical, integer, or character. The [ ] brackets are used for indexing. Indexing starts with position 1, unlike most programming languages where indexing starts from 0.
We can use integers as an index to access specific elements. We can also use negative integers to return all elements except that specific element.
x<- 101:110
x[1] #access the first element
x[c(2,3,4,5)] #Extract 2nd, 3rd, 4th, and 5th elements
x[5:10] #Extract all elements from 5th to 10th
x[c(-5,-10)] #Extract all elements except 5th and 10th
x[-c(5:10)] #Extract all elements except from 5th to 10th
Output: x[1] #Extract the first element [1] 101 x[c(2,3,4,5)] #Extract 2nd, 3rd, 4th, and 5th elements [1] 102 103 104 105 x[5:10] #Extract all elements from 5th to 10th [1] 105 106 107 108 109 110 x[c(-5,-10)] #Extract all elements except 5th and 10th [1] 101 102 103 104 106 107 108 109 x[-c(5:10)] #Extract all elements except from 5th to 10th [1] 101 102 103 104
If you use a logical vector for indexing, the position where the logical vector is TRUE will be returned.
x[x < 105]
x[x>=104]
Output: x[x < 105] [1] 101 102 103 104 x[x>=104] [1] 104 105 106 107 108 109 110
We can modify a vector and assign a new value to it. You can truncate a vector by using reassignments. Check the below example.
x<- 10:12
x[1]<- 101 #Modify the first element
x
x[2]<-102 #Modify the 2nd element
x
x<- x[1:2] #Truncate the last element
x
Output: x [1] 101 11 12 x[2]<-102 #Modify the 2nd element x [1] 101 102 12 x<- x[1:2] #Truncate the last element x [1] 101 102
We can use arithmetic operations on two vectors of the same length. They can be added, subtracted, multiplied, or divided. Check the output of the below code.
# Create two vectors.
v1 <- c(1:10)
v2 <- c(101:110)
# Vector addition.
add.result <- v1+v2
print(add.result)
# Vector subtraction.
sub.result <- v2-v1
print(sub.result)
# Vector multiplication.
multi.result <- v1*v2
print(multi.result)
# Vector division.
divi.result <- v2/v1
print(divi.result)
Output: print(add.result) [1] 102 104 106 108 110 112 114 116 118 120 print(sub.result) [1] 100 100 100 100 100 100 100 100 100 100 print(multi.result) [1] 101 204 309 416 525 636 749 864 981 1100 print(divi.result) [1] 101.00000 51.00000 34.33333 26.00000 21.00000 17.66667 15.28571 13.50000 12.11111 11.00000
The minimum and the maximum of a vector can be found using the min() or the max() function. range() is also available which returns the minimum and maximum in a vector.
x<- 1001:1010
max(x) # Find the maximum
min(x) # Find the minimum
range(x) #Find the range
Output: max(x) # Find the maximum [1] 1010 min(x) # Find the minimum [1] 1001 range(x) #Find the range [1] 1001 1010
The list is a data structure having elements of mixed data types. A vector having all elements of the same type is called an atomic vector but a vector having elements of a different type is called list.
We can check the type with typeof() or class() function and find the length using length()function.
x <- list("stat",5.1, TRUE, 1 + 4i)
x
class(x)
typeof(x)
length(x)
Output: x [[1]] [1] "stat" [[2]] [1] 5.1 [[3]] [1] TRUE [[4]] [1] 1+4i class(x) [1] “list” typeof(x) [1] “list” length(x) [1] 4
You can create an empty list of a prespecified length with the vector() function.
x <- vector("list", length = 10)
x
Output: x [[1]] NULL [[2]] NULL [[3]] NULL [[4]] NULL [[5]] NULL [[6]] NULL [[7]] NULL [[8]] NULL [[9]] NULL [[10]] NULL
Lists can be subset using two syntaxes, the $ operator, and square brackets []. The $ operator returns a named element of a list. The [] syntax returns a list, while the [[]] returns an element of a list.
# subsetting
l$e
l["e"]
l[1:2]
l[c(1:2)] #index using integer vector
l[-c(3:length(l))] #negative index to exclude elements from 3rd up to last.
l[c(T,F,F,F,F)] # logical index to access elements
Output: > l$e [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 1 0 0 0 0 0 0 0 0 0 [2,] 0 1 0 0 0 0 0 0 0 0 [3,] 0 0 1 0 0 0 0 0 0 0 [4,] 0 0 0 1 0 0 0 0 0 0 [5,] 0 0 0 0 1 0 0 0 0 0 [6,] 0 0 0 0 0 1 0 0 0 0 [7,] 0 0 0 0 0 0 1 0 0 0 [8,] 0 0 0 0 0 0 0 1 0 0 [9,] 0 0 0 0 0 0 0 0 1 0 [10,] 0 0 0 0 0 0 0 0 0 1 > l["e"] $e [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 1 0 0 0 0 0 0 0 0 0 [2,] 0 1 0 0 0 0 0 0 0 0 [3,] 0 0 1 0 0 0 0 0 0 0 [4,] 0 0 0 1 0 0 0 0 0 0 [5,] 0 0 0 0 1 0 0 0 0 0 [6,] 0 0 0 0 0 1 0 0 0 0 [7,] 0 0 0 0 0 0 1 0 0 0 [8,] 0 0 0 0 0 0 0 1 0 0 [9,] 0 0 0 0 0 0 0 0 1 0 [10,] 0 0 0 0 0 0 0 0 0 1 > l[1:2] [[1]] [1] 1 2 3 4 [[2]] [1] FALSE > l[c(1:2)] #index using integer vector [[1]] [1] 1 2 3 4 [[2]] [1] FALSE > l[-c(3:length(l))] #negative index to exclude elements from 3rd up to last. [[1]] [1] 1 2 3 4 [[2]] [1] FALSE l[c(T,F,F,F,F)] [[1]] [1] 1 2 3 4
We can change components of a list through reassignment.
l[["name"]] <- "Kalyan Nandi"
l
Output: [[1]] [1] 1 2 3 4 [[2]] [1] FALSE [[3]] [1] “Hello Statistics!” $d function (arg = 42) { print(“Hello World!”) } $name [1] “Kalyan Nandi”
In R Programming Matrix is a two-dimensional data structure. They contain elements of the same atomic types. A Matrix can be created using the matrix() function. R can also be used for matrix calculations. Matrices have rows and columns containing a single data type. In a matrix, the order of rows and columns is important. Dimension can be checked directly with the dim() function and all attributes of an object can be checked with the attributes() function. Check the below example.
Creating a matrix in R
m <- matrix(nrow = 2, ncol = 3)
dim(m)
attributes(m)
m <- matrix(1:20, nrow = 4, ncol = 5)
m
Output: dim(m) [1] 2 3 attributes(m) $dim [1] 2 3 m <- matrix(1:20, nrow = 4, ncol = 5) m [,1] [,2] [,3] [,4] [,5] [1,] 1 5 9 13 17 [2,] 2 6 10 14 18 [3,] 3 7 11 15 19 [4,] 4 8 12 16 20
Matrices can be created by column-binding or row-binding with the cbind() and rbind() functions.
x<-1:3
y<-10:12
z<-30:32
cbind(x,y,z)
rbind(x,y,z)
Output: cbind(x,y,z) x y z [1,] 1 10 30 [2,] 2 11 31 [3,] 3 12 32 rbind(x,y,z) [,1] [,2] [,3] x 1 2 3 y 10 11 12 z 30 31 32
By default, the matrix function reorders a vector into columns, but we can also tell R to use rows instead.
x <-1:9
matrix(x, nrow = 3, ncol = 3)
matrix(x, nrow = 3, ncol = 3, byrow = TRUE)
Output cbind(x,y,z) x y z [1,] 1 10 30 [2,] 2 11 31 [3,] 3 12 32 rbind(x,y,z) [,1] [,2] [,3] x 1 2 3 y 10 11 12 z 30 31 32
In R, Arrays are the data types that can store data in more than two dimensions. An array can be created using the array() function. It takes vectors as input and uses the values in the dim parameter to create an array. If you create an array of dimensions (2, 3, 4) then it creates 4 rectangular matrices each with 2 rows and 3 columns. Arrays can store only data type.
We can give names to the rows, columns, and matrices in the array by setting the dimnames parameter.
v1 <- c(1,2,3)
v2 <- 100:110
col.names <- c("Col1","Col2","Col3","Col4","Col5","Col6","Col7")
row.names <- c("Row1","Row2")
matrix.names <- c("Matrix1","Matrix2")
arr4 <- array(c(v1,v2), dim=c(2,7,2), dimnames = list(row.names,col.names, matrix.names))
arr4
Output: , , Matrix1 Col1 Col2 Col3 Col4 Col5 Col6 Col7 Row1 1 3 101 103 105 107 109 Row2 2 100 102 104 106 108 110 , , Matrix2 Col1 Col2 Col3 Col4 Col5 Col6 Col7 Row1 1 3 101 103 105 107 109 Row2 2 100 102 104 106 108 110
# Print the 2nd row of the 1st matrix of the array.
print(arr4[2,,1])
# Print the element in the 2nd row and 4th column of the 2nd matrix.
print(arr4[2,4,2])
# Print the 2nd Matrix.
print(arr4[,,2])
Output: > print(arr4[2,,1]) Col1 Col2 Col3 Col4 Col5 Col6 Col7 2 100 102 104 106 108 110 > > # Print the element in the 2nd row and 4th column of the 2nd matrix. > print(arr4[2,4,2]) [1] 104 > > # Print the 2nd Matrix. > print(arr4[,,2]) Col1 Col2 Col3 Col4 Col5 Col6 Col7 Row1 1 3 101 103 105 107 109 Row2 2 100 102 104 106 108 110
Factors are used to represent categorical data and can be unordered or ordered. An example might be “Male” and “Female” if we consider gender. Factor objects can be created with the factor() function.
x <- factor(c("male", "female", "male", "male", "female"))
x
table(x)
Output: x [1] male female male male female Levels: female male table(x) x female male 2 3
By default, Levels are put in alphabetical order. If you print the above code you will get levels as female and male. But if you want to get your levels in a particular order then set levels parameter like this.
x <- factor(c("male", "female", "male", "male", "female"), levels=c("male", "female"))
x
table(x)
Output: x [1] male female male male female Levels: male female table(x) x male female 3 2
Data frames are used to store tabular data in R. They are an important type of object in R and are used in a variety of statistical modeling applications. Data frames are represented as a special type of list where every element of the list has to have the same length. Each element of the list can be thought of as a column and the length of each element of the list is the number of rows. Unlike matrices, data frames can store different classes of objects in each column. Matrices must have every element be the same class (e.g. all integers or all numeric).
Data frames can be created explicitly with the data.frame() function.
employee <- c('Ram','Sham','Jadu')
salary <- c(21000, 23400, 26800)
startdate <- as.Date(c('2016-11-1','2015-3-25','2017-3-14'))
employ_data <- data.frame(employee, salary, startdate)
employ_data
View(employ_data)
Output: employ_data employee salary startdate 1 Ram 21000 2016-11-01 2 Sham 23400 2015-03-25 3 Jadu 26800 2017-03-14 View(employ_data)
If you look at the structure of the data frame now, you see that the variable employee is a character vector, as shown in the following output:
str(employ_data)
Output: > str(employ_data) 'data.frame': 3 obs. of 3 variables: $ employee : Factor w/ 3 levels "Jadu","Ram","Sham": 2 3 1 $ salary : num 21000 23400 26800 $ startdate: Date, format: "2016-11-01" "2015-03-25" "2017-03-14"
Note that the first column, employee, is of type factor, instead of a character vector. By default, data.frame() function converts character vector into factor. To suppress this behavior, we can pass the argument stringsAsFactors=FALSE.
employ_data <- data.frame(employee, salary, startdate, stringsAsFactors = FALSE)
str(employ_data)
Output: 'data.frame': 3 obs. of 3 variables: $ employee : chr "Ram" "Sham" "Jadu" $ salary : num 21000 23400 26800 $ startdate: Date, format: "2016-11-01" "2015-03-25" "2017-03-14"
The primary location for obtaining R packages is CRAN.
You can obtain information about the available packages on CRAN with the available.packages() function.
a <- available.packages()
head(rownames(a), 30) # Show the names of the first 30 packages
Packages can be installed with the install.packages() function in R. To install a single package, pass the name of the lecture to the install.packages() function as the first argument.
The following code installs the ggplot2 package from CRAN.
install.packages(“ggplot2”)
You can install multiple R packages at once with a single call to install.packages(). Place the names of the R packages in a character vector.
install.packages(c(“caret”, “ggplot2”, “dplyr”))
Loading packages
Installing a package does not make it immediately available to you in R; you must load the package. The library() function is used to load packages into R. The following code is used to load the ggplot2 package into R. Do not put the package name in quotes.
library(ggplot2)
If you have Installed your packages without root access using the command install.packages(“ggplot2″, lib=”/data/Rpackages/”). Then to load use the below command.
library(ggplot2, lib.loc=”/data/Rpackages/”)
After loading a package, the functions exported by that package will be attached to the top of the search() list (after the workspace).
library(ggplot2)
search()
In R, we can read data from files stored outside the R environment. We can also write data into files that will be stored and accessed by the operating system. R can read and write into various file formats like CSV, Excel, XML, etc.
We can check which directory the R workspace is pointing to using the getwd() function. You can also set a new working directory using setwd()function.
# Get and print current working directory.
print(getwd())
# Set current working directory.
setwd("/web/com")
# Get and print current working directory.
print(getwd())
Output: [1] "/web/com/1441086124_2016" [1] "/web/com"
The CSV file is a text file in which the values in the columns are separated by a comma. Let’s consider the following data present in the file named input.csv.
You can create this file using windows notepad by copying and pasting this data. Save the file as input.csv using the save As All files(*.*) option in notepad.
Following is a simple example of read.csv() function to read a CSV file available in your current working directory −
data <- read.csv("input.csv")
print(data)
id, name, salary, start_date, dept
Pie charts are created with the function pie(x, labels=) where x is a non-negative numeric vector indicating the area of each slice and labels= notes a character vector of names for the slices.
The basic syntax for creating a pie-chart using the R is −
pie(x, labels, radius, main, col, clockwise)
Following is the description of the parameters used −
# Simple Pie Chart
slices <- c(10, 12,4, 16, 8)
lbls <- c("US", "UK", "Australia", "Germany", "France")
pie(slices, labels = lbls, main="Pie Chart of Countries")
3-D pie chart
The pie3D( ) function in the plotrix package provides 3D exploded pie charts.
# 3D Exploded Pie Chart
library(plotrix)
slices <- c(10, 12, 4, 16, 8)
lbls <- c("US", "UK", "Australia", "Germany", "France")
pie3D(slices,labels=lbls,explode=0.1,
main="Pie Chart of Countries ")
A bar chart represents data in rectangular bars with a length of the bar proportional to the value of the variable. R uses the function barplot() to create bar charts. R can draw both vertical and Horizontal bars in the bar chart. In the bar chart, each of the bars can be given different colors.
Let us suppose, we have a vector of maximum temperatures (in degree Celsius) for seven days as follows.
max.temp <- c(22, 27, 26, 24, 23, 26, 28)
barplot(max.temp)
Some of the frequently used ones are, “main” to give the title, “xlab” and “ylab” to provide labels for the axes, names.arg for naming each bar, “col” to define color, etc.
We can also plot bars horizontally by providing the argument horiz=TRUE.
# barchart with added parameters
barplot(max.temp,
main = "Maximum Temperatures in a Week",
xlab = "Degree Celsius",
ylab = "Day",
names.arg = c("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"),
col = "darkred",
horiz = TRUE)
Simply doing barplot(age) will not give us the required plot. It will plot 10 bars with height equal to the student’s age. But we want to know the number of students in each age category.
This count can be quickly found using the table() function, as shown below.
> table(age)
age
16 17 18 19
1 2 6 1
Now plotting this data will give our required bar plot. Note below, that we define the argument “density” to shade the bars.
barplot(table(age),
main="Age Count of 10 Students",
xlab="Age",
ylab="Count",
border="red",
col="blue",
density=10
)
A histogram represents the frequencies of values of a variable bucketed into ranges. Histogram is similar to bar chat but the difference is it groups the values into continuous ranges. Each bar in histogram represents the height of the number of values present in that range.
R creates histogram using hist() function. This function takes a vector as an input and uses some more parameters to plot histograms.
The basic syntax for creating a histogram using R is −
hist(v,main,xlab,xlim,ylim,breaks,col,border)
Following is the description of the parameters used −
A simple histogram is created using input vector, label, col, and border parameters.
The script given below will create and save the histogram in the current R working directory.
# Create data for the graph.
v <- c(9,13,21,8,36,22,12,41,31,33,19)
# Give the chart file a name.
png(file = "histogram.png")
# Create the histogram.
hist(v,xlab = "Weight",col = "yellow",border = "blue")
# Save the file.
dev.off()
To specify the range of values allowed in X axis and Y axis, we can use the xlim and ylim parameters.
The width of each bar can be decided by using breaks.
# Create data for the graph.
v <- c(9,13,21,8,36,22,12,41,31,33,19)
# Give the chart file a name.
png(file = "histogram_lim_breaks.png")
# Create the histogram.
hist(v,xlab = "Weight",col = "green",border = "red", xlim = c(0,40), ylim = c(0,5),
breaks = 5)
# Save the file.
dev.off()
The debate around data analytics tools has been going on forever. Each time a new one comes out, comparisons transpire. Although many aspects of the tool remain subjective, beginners want to know which tool is better to start with.
The most popular and widely used tools for data analytics are R and SAS. Both of them have been around for a long time and are often pitted against each other. So, let’s compare them based on the most relevant factors.
Final Verdict
As per estimations by the Economic Times, the analytics industry will grow to $16 billion till 2025 in India. If you wish to venture into this domain, there can’t be a better time. Just start learning the tool you think is better based on the comparison points above.
Original article source at: https://www.mygreatlearning.com
1668753367
“Brackets are important in any programming language to execute the program and get the desired outputs. In bash, we use single and double parentheses to perform different tasks through a script. However, many beginners and even intermediate bash users need to learn about double parentheses. So in this tutorial, we will briefly summarize what double parentheses are in bash.”
The “((..))” double parentheses are similar to the let command, which you can use to perform arithmetic calculations in a script. For example, let’s create a script that will perform various arithmetic calculations:
#!/bin/bash
echo "Please enter the values of A and B"
read A
read B
sum=$((A+B))
echo "Addition of $A and $B is $sum"
sub=$((A-B))
echo "Subtraction of $A and $B is $sub"
multiply=$((A*B))
echo "Multiplication $A and $B is $multiply"
division=$((A/B))
echo "Division of $A and $B is $division"
Once you run the above script, the terminal will ask you to enter two numbers, and then it will perform the calculations:
Similarly, you can use the following patterns of double parentheses styles to get the required results:
#!/bin/bash
echo "Please enter the values of A and B"
read A
read B
sum=$((A+B))
echo "Addition of $A and $B is $sum"
((sub=A-B))
echo "Subtraction of $A and $B is $sub"
num1=A
num2=B
((multiply=num1*num2))
echo "Multiplication $A and $B is $multiply"
division=$((num1/num2))
echo "Division of $A and $B is $division"
This script provides the same result as the previous one:
You can also use the [[ rather than [ because it is an advanced type that offers a ton of enhancements such as:
This was all about the double parentheses in bash, which you can try to enhance the arithmetic calculations easily. We have explained various types of examples to perform arithmetic calculations by adding double parentheses. Bash contains a ton of concepts that you can learn to become a bash expert. So make sure you check out Linuxhint to read various tutorials of bash.
Original article source at: https://linuxhint.com/
1668488605
“Brackets are important in any programming language to execute the program and get the desired outputs. In bash, we use single and double parentheses to perform different tasks through a script. However, many beginners and even intermediate bash users need to learn about double parentheses. So in this tutorial, we will briefly summarize what double parentheses are in bash.”
The “((..))” double parentheses are similar to the let command, which you can use to perform arithmetic calculations in a script. For example, let’s create a script that will perform various arithmetic calculations:
#!/bin/bash
echo "Please enter the values of A and B"
read A
read B
sum=$((A+B))
echo "Addition of $A and $B is $sum"
sub=$((A-B))
echo "Subtraction of $A and $B is $sub"
multiply=$((A*B))
echo "Multiplication $A and $B is $multiply"
division=$((A/B))
echo "Division of $A and $B is $division"
Once you run the above script, the terminal will ask you to enter two numbers, and then it will perform the calculations:
Similarly, you can use the following patterns of double parentheses styles to get the required results:
#!/bin/bash
echo "Please enter the values of A and B"
read A
read B
sum=$((A+B))
echo "Addition of $A and $B is $sum"
((sub=A-B))
echo "Subtraction of $A and $B is $sub"
num1=A
num2=B
((multiply=num1*num2))
echo "Multiplication $A and $B is $multiply"
division=$((num1/num2))
echo "Division of $A and $B is $division"
This script provides the same result as the previous one:
You can also use the [[ rather than [ because it is an advanced type that offers a ton of enhancements such as:
This was all about the double parentheses in bash, which you can try to enhance the arithmetic calculations easily. We have explained various types of examples to perform arithmetic calculations by adding double parentheses. Bash contains a ton of concepts that you can learn to become a bash expert. So make sure you check out Linuxhint to read various tutorials of bash.
Original article source at: https://linuxhint.com/
1665269700
OSC.jl provides an implementation of the OSC binary format commonly used in networked control of musical applications. The code is based on a relatively straightforward translation of librtosc(https://github.com/fundamental/rtosc)
i = Int32( 42 ); #integer
f = Float32( 0.25; ); #float
s = "string" #string
b = s; #blob
h = Int64( -125; ); #long integer
t = UInt64( 22412; ); #timetag
d = Float64( 0.125; ); #double
S = "Symbol" #symbol
c = Char( 'J' ); #character
r = Int32( 0x12345678 ); #RGBA
m = Array{UInt8,1}( [0x12,0x23, #midi
0x34,0x45]);
#true
#false
#nil
#inf
msg = OscMsg("/dest", "[ifsbhtdScrmTFNI]", i,f,s,b,h,t,d,S,c,r,m);
show(msg)
This produces:
OSC Message to /dest
Arguments:
# 1 i:Int32 - 42
# 2 f:Float32 - 0.25
# 3 s:String - string
# 4 b:Blob - Uint8[115 116 114 105 110 103]
# 5 h:Int32 - -125
# 6 t:Uint64 - 22412
# 7 d:Float64 - 0.125
# 8 S:Symbol - Symbol
# 9 c:Char - J
#10 r:RBG - 305419896
#11 m:Midi - Uint8[18 35 52 69]
#12 T: - true
#13 F: - false
#14 N:Nothing - nothing
#15 I:Inf - nothing
Accessing the fields is done via the [] operator.
Most of the usage is going to involve sending the OSC messages over UDP to another program. To do this, first start two julia instances. In the first one run
using Sockets
using OpenSoundControl
sock2 = UDPSocket()
bind(sock2, ip"127.0.0.1", 7777)
msg2 = OscMsg(recv(sock2))
show(msg2)
The first instance will now wait for the second to send an OSC message. To send the an OSC message, in the second window type.
using Sockets
using OpenSoundControl
sock1 = UDPSocket()
msg1 = OpenSoundControl.message("/hello world", "sSif", "strings", "symbols", Int32(234), Float32(2.3))
send(sock1, ip"127.0.0.1", 7777, msg1.data)
Author: fundamental
Source Code: https://github.com/fundamental/OpenSoundControl.jl
License: LGPL-3.0 license
1653067920
C ++にはstring
, int
, char
, bool
, float
, double
.などのさまざまなデータ型string
があります。これらの各データ型には、格納できる特定の値があります。
整数を操作する場合、通常、整数をint
データ型に格納します。ただし、これは整数に対してのみ役立ちます。
数値を小数で格納する場合は、float
またはを使用できますdouble
。これらの2つのデータ型は同様の目的で使用されますが、いくつかの違いがあります。
この記事では、いくつかの例とともに、C++でのfloatとdoubleの違いについて説明します。
このセクションはサブセクションに分割され、各セクションはフロートとダブルの1つの違いに焦点を当てます。
のバイトサイズfloat
は4ですが、のバイトサイズdouble
は8です。
これは、保持できるdouble
量の2倍の値を格納できることを意味しfloat
ます。
sizeof()
これは、演算子を使用して確認できます。次に例を示します。
#include <iostream>
using namespace std;
int main() {
cout << "float: " << sizeof(float) << endl; // float: 4
cout << "double: " << sizeof(double) << endl;// double: 8
}
10進数が多い数値を処理する場合、通常、結果の値が正確であることが望まれます。しかし、結果の精度は、処理している小数点以下の桁数に依存します。
心配しないでください、私たちはまだ数学ではなく、C++について話しているのです。
floatdouble
保持できる小数点以下の桁数に関しては、どちらも容量が異なります。float
最大15桁を保持できるのに対し、最大7桁の小数点以下を正確にdouble
保持できます。
これを示すためにいくつかの例を見てみましょう。
#include <iomanip>
#include <iostream>
using namespace std;
int main() {
double MY_DOUBLE_VALUE = 5.12345678987;
float MY_FLOAT_VALUE = 5.12345678987;
cout << setprecision(7);
cout << MY_DOUBLE_VALUE << endl; // 5.123457
cout << MY_FLOAT_VALUE << endl; // 5.123457
}
float
上記の例では、変数を作成しました。double
どちらも同じ値です5.12345678987
。
このsetprecision()
関数は、出力する小数点以下の桁数をコンパイラーに通知するために使用されます。この場合、値は7です。
上記のコードの結果から、両方の変数が小数点以下7桁までの正確な値を出力していることがわかります5.123457
。
関数のパラメーターsetprecision()
を12に増やして、何が起こるか見てみましょう。
#include <iomanip>
#include <iostream>
using namespace std;
int main() {
double MY_DOUBLE_VALUE = 5.12345678987;
float MY_FLOAT_VALUE = 5.12345678987;
cout << setprecision(12);
cout << MY_DOUBLE_VALUE << endl; // 5.12345678987
cout << MY_FLOAT_VALUE << endl; // 5.12345695496
}
上記の結果から、MY_DOUBLE_VALUE
変数は正確な値を出力しました。しかし、MY_FLOAT_VALUE
変数は、小数点以下第7位から、与えられた元の値とはまったく異なる値を出力しました。
これは、両方のデータ型の精度を示しています。と同様float
に、データ型の精度範囲を超える値を返そうとするとdouble
、不正確な値が返されます。
float
範囲が狭いため、主にグラフィックライブラリで高い処理能力のために使用されます。
double
10進値が四捨五入されているときのエラーを排除するために、プログラミングの計算に主に使用されます。引き続き使用できますがfloat
、小さい小数値を処理する場合にのみ使用する必要があります。安全のために、常にを使用する必要がありますdouble
。
この記事では、C++でのfloatとdoubleの違いについて説明しました。
バイトサイズ、精度、使用法の3つの違いについて話しました。
また、doubleのバイトサイズはfloatの2倍であることも学びました。また、大きな10進値を処理する場合は、doubleの方が正確です。
最後に、各データ型をいつ使用するかを理解するのに役立つユースケースについて説明しました。
ハッピーコーディング!
出典:https ://www.freecodecamp.org/news/double-vs-float-in-cpp-the-difference-between-floats-and-doubles/
1653067740
En C++, hay varios tipos de datos como string
, int
, char
, bool
, float
y double
. Cada uno de estos tipos de datos tiene valores específicos que se pueden almacenar en ellos.
Cuando trabajamos con números enteros, generalmente los almacenamos en un int
tipo de datos. Pero esto solo es útil para números enteros.
Cuando queremos almacenar números con decimales, podemos usar float
o double
. Aunque estos dos tipos de datos se usan para un propósito similar, tienen algunas diferencias.
En este artículo, hablaremos sobre las diferencias entre flotantes y dobles en C++ junto con algunos ejemplos.
Esta sección se dividirá en subsecciones y cada sección se centrará en una diferencia entre flotadores y dobles.
El tamaño de bytes para float
es 4 mientras que el tamaño de bytes para double
es 8.
Esto implica que double
puede almacenar valores que son el doble de la cantidad que float
puede almacenar.
Podemos ver esto usando el sizeof()
operador. Aquí hay un ejemplo:
#include <iostream>
using namespace std;
int main() {
cout << "float: " << sizeof(float) << endl; // float: 4
cout << "double: " << sizeof(double) << endl;// double: 8
}
Cuando trabajamos con números que tienen muchos dígitos decimales, generalmente esperamos que el valor resultante sea exacto. Pero la precisión de nuestro resultado depende de la cantidad de dígitos decimales con los que estemos tratando.
No se preocupe, seguimos hablando de C++, no de matemáticas.
float
y double
ambos tienen diferentes capacidades cuando se trata de la cantidad de dígitos decimales que pueden contener. float
puede contener hasta 7 dígitos decimales con precisión, mientras que double
puede contener hasta 15.
Veamos algunos ejemplos para demostrar esto.
#include <iomanip>
#include <iostream>
using namespace std;
int main() {
double MY_DOUBLE_VALUE = 5.12345678987;
float MY_FLOAT_VALUE = 5.12345678987;
cout << setprecision(7);
cout << MY_DOUBLE_VALUE << endl; // 5.123457
cout << MY_FLOAT_VALUE << endl; // 5.123457
}
En el ejemplo anterior, creamos float
y double
variables, ambas con el mismo valor: 5.12345678987
.
La setprecision()
función se usa para decirle al compilador el número de lugares decimales que queremos imprimir. En nuestro caso, el valor es 7.
Podemos observar a partir de los resultados en el código anterior, que ambas variables imprimieron valores precisos hasta el séptimo lugar decimal: 5.123457
.
Aumentemos el parámetro en la setprecision()
función a 12 y veamos qué sucede.
#include <iomanip>
#include <iostream>
using namespace std;
int main() {
double MY_DOUBLE_VALUE = 5.12345678987;
float MY_FLOAT_VALUE = 5.12345678987;
cout << setprecision(12);
cout << MY_DOUBLE_VALUE << endl; // 5.12345678987
cout << MY_FLOAT_VALUE << endl; // 5.12345695496
}
A partir de los resultados anteriores, la MY_DOUBLE_VALUE
variable imprimió valores precisos. Pero la MY_FLOAT_VALUE
variable, a partir de su séptimo lugar decimal, imprimió valores completamente diferentes del valor original que se le dio.
Esto nos muestra la precisión de ambos tipos de datos. Al igual que float
, si tratamos de devolver un valor que excede el rango de precisión para el double
tipo de datos, obtendremos un valor inexacto.
float
se utiliza principalmente en bibliotecas gráficas para una alta potencia de procesamiento debido a su pequeño alcance.
double
se usa principalmente para cálculos en programación para eliminar errores cuando se redondean los valores decimales. Aunque float
todavía se puede usar, solo debería ser en los casos en que estemos tratando con valores decimales pequeños. Para estar seguro, siempre debe usar double
.
En este artículo, hablamos sobre las diferencias entre flotantes y dobles en C++.
Hablamos de tres diferencias: tamaño de byte, precisión y uso.
También aprendimos que los dobles tienen el doble de tamaño en bytes que los flotantes. Además, los dobles son más precisos cuando se trata de valores decimales grandes.
Por último, hablamos sobre casos de uso que nos ayudaron a comprender cuándo usar cada tipo de datos.
¡Feliz codificación!
1624097700
Recently I was solving an interesting bug that came down to comparing two Double
variables with equals
method. It looks innocent, what can be wrong with something like firstDouble.equals(secondDouble)
?
The problem here is with how doubles are stored. To fit them into 64bytes (usually) they are rounded.
See the example below:
Double firstDouble = 0d;
for (int i = 1; i <= 42; i++) {
firstDouble += 0.1;
}
Double secondDouble = 0.1 * 42;
System.out.println(firstDouble); // 4.200000000000001
System.out.println(secondDouble); // 4.2
System.out.println(firstDouble.equals(secondDouble)); // false
This inaccuracy is caused by rounding errors.
We need to use a different approach to compare those doubles.
#java #double comparison in java #double comparison #comparisons #double