根据列值选择多行,然后将两个列值相互分开并将它们相乘R中

时间:2018-03-14 10:08:54

标签: r row division multiplication

我是R的新手,请耐心等待!我有一个名为 State City DL KarolBag DL Ashok Nagr UP Noida UP Lucknow 的数据框。以下是相关列的示例:

mydata

现在,我想要完成的工作如下:我想选择Backlog.Item.Type State Task.Initial.Hours.Estimate Task.Completed.Hours Epic In Progress NA NA Feature New NA NA Product Backlog Item Done NA NA Task Done 5.00 0.50 Task Done 3.00 0.50 Task Done 5.50 6.50 Task Done 2.50 3.00 Task Done 2.00 5.50 Task Done 2.00 3.00 Product Backlog Item Done NA NA Product Backlog Item Done NA NA Product Backlog Item Approved NA NA Task In Progress NA NA =任务的值,Backlog.Item.Type =完成和State& Task.Initial.Hours.Estimate不是N / A或0.00。一旦选择了满足这些条件的行,我想对它们执行以下计算:Task.Completed.Hours /(除以)Task.Completed.Hours x(乘以)100。然后我想存储这个新的新列中的值并计算整个列的平均值。在此先感谢,我希望我已经足够清楚,并以可理解的方式提出我的问题!

3 个答案:

答案 0 :(得分:0)

您可以构建logical向量,其中TRUE表示您感兴趣的样本,而FALSE表示样本不是您感兴趣的。 如果没有访问数据就很难构建正确的代码,但我会尽力帮助您(考虑data是您显示的矩阵的名称)。

# Build the logical vector (according to what you mentioned)
   # First condition
     cond1 <- data$Backlog.Item.Type == "Task"
   # Second condition
     cond2 <- !data$Task.Initial.Hours.Estimate %in% c("NA", 0)
   # Third condition
     cond3 <- !data$Task.Completed.Hours %in% c("NA",0)
   # The final logical vector can be computed
     l <- as.logical(cond1*cond2*cond3)

# Take the subset of samples satisfying the three conditions
  sub.data <- data[l,]

# The new value
  new <- 100*sub.data$Task.Completed.Hours/sub.data$Task.Initial.Hours.Estimate

# Add new into tha table
  sub.data$new <- new

答案 1 :(得分:0)

试试这个:

library(tidyverse)
result <- mydata %>%
  as_tibble() %>% 
  filter(Backlog.Item.Type=="Task" & 
         State=="Done" & 
         Task.Completed.Hours>0) %>% 
  mutate(new_var=Task.Completed.Hours/Task.Initial.Hours.Estimate*100)

输出是:

# A tibble: 6 x 5
  Backlog.Item.Type State Task.Initial.Hours.Estimate Task.Completed.Hours    new_var
  <chr>             <chr>                       <dbl>                <dbl>   <dbl>
1 Task              Done                         5.00                0.500    10.0
2 Task              Done                         3.00                0.500    16.7
3 Task              Done                         5.50                6.50    118  
4 Task              Done                         2.50                3.00    120  
5 Task              Done                         2.00                5.50    275  
6 Task              Done                         2.00                3.00    150 

答案 2 :(得分:0)

你确实在你的问题中提到过你在R上变暖了,但是如果你对这个问题进行试验,它对每个人都会有用。

如何根据您的要求对数据框here进行子集化(选择行或列),这是一个很好的资源。

现在,假设df是您的数据框。 在R中,数据帧按以下格式进行子集化:

df[ROWs,COLUMNs]

虽然您可以在方括号内传递行/列号以对数据帧进行子集化,但一种非常有用的方法是使用逻辑向量。

例如:

df <- mtcars
#Create a logical vector to subset rows
logical_vector <- df$mpg > 20
#Use logical_vector to subset df
df[logical_vector,]

这将选择每加仑行驶里程大于20的所有行。

关于你的问题:

您应首先创建一个处理所有条件的逻辑向量:

####CONDITIONS
cond1_vec <- df$Backlog.Item.Type == "Task"
cond2_vec <- df$State == "Done"
#Next condition should check that Task.Completed.Hours is NOT empty OR 0.
cond3_vec <- (!is.na(df$Task.Completed.Hours) | df$Task.Completed.Hours != 0)
#Next condition should check that Task.Initial.Hours.Estimate is NOT empty OR 0.
cond4_vec <- (!is.na(df$Task.Initial.Hours.Estimate) | df$Task.Initial.Hours.Estimate != 0)


####SUBSETTING
#Now, select only those rows which satisfy ALL of the above conditions
#That's why we join the conditions using AND (&)
row_select_vector <-  cond1_vec & cond2_vec & cond3_vec & cond4_vec

#Use the method of subsetting dataframes using logical vectors
df_selected <- df[row_select_vector,]


####NEW COLUMN
#Now create a new column which gives the quotient of Hours by Estimate
df_selected$Ratio <- df_selected$Task.Completed.Hours / df_selected$Task.Initial.Hours.Estimate


####FINAL CALCULATION
#Calculate mean
ratio_mean <- mean(df_selected$Ratio)

很少有事情需要注意:

  1. is.na()用于检查字段是否为NA。执行df$field == NA

  2. 是不正确的
  3. 您可以在子集中将所有条件组合在行字段中。但是,当你有很多条件需要检查时,创建一个不同的逻辑向量会更加清晰。

  4. 查看R中的subset()功能 - 您可能会觉得更容易。