【问题标题】:Conditional if loop for array multiplication - R用于数组乘法的条件 if 循环 - R
【发布时间】:2016-12-26 18:30:42
【问题描述】:

我正在尝试将数组乘以某个值。该数组包含日期,因此我想排除它们。我想使用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
}

它正在选择我想要的列的名称,我认为它是乘以这些而不是数据本身。

【问题讨论】:

  • 如果是第一列你需要if(names(df)[1] != 'Date' {....}

标签: arrays r loops if-statement dataframe


【解决方案1】:

将您的 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

【讨论】:

  • 谢谢。我知道我可以这样做,但是,我想知道是否可以循环执行。
【解决方案2】:

在 R 中执行简单循环的常用方法是使用 sapply()。我们可以首先以编程方式识别要选择的列:

idx <- names(df) != "Date"

此逻辑向量将用于 data.frame 的子集。可能还需要考虑条目可能存储为因子。为了执行乘法运算,它们应该被转换为数字形式,这是通过首先将条目强制转换为字符来获得的。

因此这应该有效:

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 循环,如:

for (i in which(idx)) df[[i]] <- as.numeric(as.character(df[[i]])) * 0.0254

正如@akrun 所指出的,我们可以在这里使用lapply() 而不是sapply()。在这种情况下,结果将是相同的。帮助页面?lapply的描述部分总结了这两个功能的区别:

‘sapply’是一个用户友好的版本,是‘lapply’的包装器 默认返回一个向量、矩阵,或者,如果'simplify = "array"',一个 适当的数组,通过应用“simplify2array()”。 '应用(x, f, 简化 = FALSE, USE.NAMES = FALSE)’ 与 ‘lapply(x, f)’。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 2012-06-04
    相关资源
    最近更新 更多