使用从现有行计算的值向数据框添加新行

时间:2018-02-04 12:46:55

标签: r dplyr

使用下面的数据框df

text <- "
Parameter,Dec-17,Sep-17,Jun-17,Mar-17,Dec-16
Income,12112,13323.2,14655.52,16121.072,17733.1792
Cost,10900.8,11990.88,13189.968,14508.9648,15959.86128
"
df <- read.table(textConnection(text), sep=",", header = T, stringsAsFactors = F)
df

  Parameter  Dec.17   Sep.17   Jun.17   Mar.17   Dec.16
1    Income 12112.0 13323.20 14655.52 16121.07 17733.18
2      Cost 10900.8 11990.88 13189.97 14508.96 15959.86

我想为每个季度添加另外两行,1- ProfitIncome - Cost)和2 - Tax0.2* Profit) - {{1} }

我如何得到这个 - Dec.17, Sep.17, Jun.17, Mar.17, Dec.16是首选。基础R解决方案也会有所帮助。

预期输出

dplyr

3 个答案:

答案 0 :(得分:2)

也许不是最优雅的,但这是一个dplyr解决方案。最后一个select是获得与原始表相同的列顺序。

df %>%
  gather(key = month, value = amount, -Parameter) %>%
  spread(Parameter, amount) %>%
  mutate(Profit = Income - Cost) %>%
  mutate(Tax = 0.2 * Profit) %>%
  gather(key = Parameter, value = amount, -month) %>%
  spread(month, value = amount) %>%
  select(names(df))

Parameter   Dec.17    Sep.17     Jun.17     Mar.17     Dec.16
1      Cost 10900.80 11990.880 13189.9680 14508.9648 15959.8613
2    Income 12112.00 13323.200 14655.5200 16121.0720 17733.1792
3    Profit  1211.20  1332.320  1465.5520  1612.1072  1773.3179
4       Tax   242.24   266.464   293.1104   322.4214   354.6636

答案 1 :(得分:1)

这是基础R解决方案:

df <- data.frame(t(df[, 2:ncol(df)]))
names(df) <- c("Income", "Cost")

df$Profit <- (df$Income - df$Cost)
df$Tax <- ( 0.2* df$Profit)
df <- data.frame(t(df))

再次添加“参数”列:

df$Parameter <- rownames(df)
df <- df[c(ncol(df), 2:ncol(df) -1)]

答案 2 :(得分:1)

仅使用R的根函数我尝试使用给定数据解决问题。

<uses-permission android:name="android.permission.INTERNET"/>

我转换为矩阵并完成两行之间的差异,并在矩阵内添加行和rbind的名称。 对于

webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
            {
                // Handle the error
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url)
            {
                view.loadUrl(url);
                return true;
            }
        });

然后,我重命名了第一个名称行,并使用rbind收集数据帧的新行,将newrow(矩阵)的格式更改为数据帧。

text <- "
Parameter,Dec-17,Sep-17,Jun-17,Mar-17,Dec-16
Income,12687.6,13980.1,14506.5,14299.8,15239.6
Cost,11418.84,12582.09,13055.85,12869.82,13715.64
"
df <- read.table(textConnection(text), sep=",", header = T, stringsAsFactors = F)

结果如下:

df.matrix <- as.matrix(df)
new.row <- df[2,c(2,3,4,5,6)] - df[1,c(2,3,4,5,6)]
new.row <- cbind("Income - Cost", new.row)

最后,行的名称是1,2和21.我们可以将它们归零:

colnames(new.row)[1] <- "Parameter"

df <- rbind(df,as.data.frame(new.row))

或重命名为您希望的订单

      Parameter   Dec.17   Sep.17   Jun.17   Mar.17   Dec.16
1         Income 12687.60 13980.10 14506.50 14299.80 15239.60
2           Cost 11418.84 12582.09 13055.85 12869.82 13715.64
21 Income - Cost -1268.76 -1398.01 -1450.65 -1429.98 -1523.96

希望这会有所帮助。

相关问题