我试图将数组乘以某个值。该数组包含日期,因此我想排除它们。我想使用if
循环。我知道还有其他方法。
数据:
Date <- c("2014-12-18","2015-01-16", "2015-01-30")
W1 <- c("456", "468", "789")
W2 <- c("456", "468", "789")
W3 <- c("456", "468", "789")
df <- data.frame(Date, W1,W2,W3)
df$Date <- as.Date(df$Date, format="%Y-%m-%d")
当前if
循环无效:
if(names(df) != "Date"){
df_m <- df*0.0254
}
它正在选择我想要的列的名称,我认为它是多个而不是数据本身。
答案 0 :(得分:2)
将您的W
列强制转换为数字,然后它只是:
df_m <- data.frame(df$Date, df[,-1]*0.0254)
也就是说,您的数据为:
Date <- c("2014-12-18","2015-01-16", "2015-01-30")
W1 <- as.numeric(c("456", "468", "789"))
W2 <- as.numeric(c("456", "468", "789"))
W3 <- as.numeric(c("456", "468", "789"))
df <- data.frame(Date, W1,W2,W3)
df$Date <- as.Date(df$Date, format="%Y-%m-%d")
我们得到:
df_m <- data.frame(df$Date, df[,-1]*0.0254)
## df.Date W1 W2 W3
##1 2014-12-18 11.5824 11.5824 11.5824
##2 2015-01-16 11.8872 11.8872 11.8872
##3 2015-01-30 20.0406 20.0406 20.0406
如果你坚持使用循环,那么使用for
循环(即,if
不是循环):
df_m <- df
for (i in which(names(df) != "Date")) {
df_m[, i] <- df_m[, i] * 0.0254
}
同样,W
列应为numeric
。
答案 1 :(得分:2)
在R中执行简单循环的常用方法是使用foo="foo"
bar="bar"
foo="foo"
bar="bar"
。我们可以首先以编程方式识别要选择的列:
sapply()
此逻辑向量将用于data.frame的子集化。可能还需要考虑条目可能存储为因子。为了执行乘法,它们应该被转换为数字形式,这是通过首先将条目强制转换为字符而获得的。
因此,这应该有效:
idx <- names(df) != "Date"
df[idx] <- sapply(df[idx], function(x) as.numeric(as.character(x))*0.0254)
#> df
# Date W1 W2 W3
#1 2014-12-18 11.5824 11.5824 11.5824
#2 2015-01-16 11.8872 11.8872 11.8872
#3 2015-01-30 20.0406 20.0406 20.0406
的子集和值分配等同于sapply()
循环,如:
for
正如@akrun所指出的,我们可以在这里使用for (i in which(idx)) df[[i]] <- as.numeric(as.character(df[[i]])) * 0.0254
代替lapply()
。在这种情况下,结果将是相同的。帮助页面sapply()
的描述部分总结了这两个功能之间的差异:
'sapply'是一个用户友好的版本和'lapply'的包装 默认返回一个向量,矩阵,如果'simplify =“array”',则为 数组(如果适用),应用'simplify2array()'。 “sapply(X, f,simplify = FALSE,USE.NAMES = FALSE)'与'lapply(x, F)”